90000+9000+9000+900+900+90+90+9+9
=109998个
看来是不多
人生路难走,转眼已白头。伤心望远山,黯然下小楼。
//---------------------------------------------------------------------------
DEV-C++
[此贴子已经被作者于2007-11-8 15:59:59编辑过]
19楼:
int main(void)
{
long int data=MIN;
while(data<=MAX)
{
if(sushu(data))
{
printf("%ld\n",data); /* 你的程序,相当于只判断了最后一个素数是不是回文吧... */
data=nexthuiwen(data);
}
}
return 0;
}
[此贴子已经被作者于2007-11-8 19:03:08编辑过]
修正了一下
在DEV C++4.9.9.2 中运行通过, 花了 4.0000秒。
#include<stdio.h>
#include<math.h>
#include<time.h>
#define MAX 1000000000
#define MIN 3
long int pow10(int i)
//因为DEV C++中的math.h没有 pow10函数,所以现编了一个
//输入:int型整数
//输出:返回10的该整数次幂,返回类型为long int。
{
long int result=1;
while(i>0)
{
result*=10;
i--;
}
return result;
}
long int nexthuiwen(long int currenthuiwen)
//输入:一个回文数
//输出:比当前回文数大的最小回文数
{
long int i=currenthuiwen,m;
int weishu=0; //数字的位数
long int j=0;
// printf("当前回文数是:%ld\n",i);
while(i>0) //求出数值的位数
{
i=i/10;
weishu+=1;
}
if(weishu==1) //求出规整前的新数
{
currenthuiwen+=1;
}
else
{
currenthuiwen+=pow10(weishu/2);
currenthuiwen=currenthuiwen-currenthuiwen%pow10(weishu/2);
}
// printf("新数为:%ld\n",currenthuiwen);
i=currenthuiwen; //求出规整前数值的位数
weishu=0;
while(i>0)
{
i=i/10;
weishu+=1;
}
for(j=1;j<=weishu/2;j++) //规整新数
{
m=currenthuiwen/(long int)pow10(weishu-j)%10*(long int)pow10(j-1);
// printf("%ld\n",m);
currenthuiwen+=m;
}
// printf("新的回文数是: %ld\n",currenthuiwen);
return currenthuiwen;
}
int sushu(long int data)
//输入:任意长整数
//输出:若该整数为素数,则输出1,否则输出0
{
long int end=(long int)sqrt(data);
long int i;
for(i=2;i<=end;i++)
{
if(data%i==0)return 0;
}
return 1;
}
int main(void)
{
long int data=MIN;
clock_t start,end;
start=clock();
while(data<=MAX)
{
if(sushu(data)) printf("%ld\n",data);
data=nexthuiwen(data);
}
end=clock();
printf("%lf\n",(double)((end-start)/CLOCKS_PER_SEC));
return 0;
}