当前位置: 代码迷 >> C语言 >> [求助]这是一个关于回数的程序,是我们的作业 ,可是却做不出来
  详细解决方案

[求助]这是一个关于回数的程序,是我们的作业 ,可是却做不出来

热度:101   发布时间:2007-11-08 15:30:06.0
1-1000000000以内的回文数应该有
90000+9000+9000+900+900+90+90+9+9
=109998个

看来是不多
----------------解决方案--------------------------------------------------------
我的电脑从0数到9999居然要3秒半。。。。


----------------解决方案--------------------------------------------------------
以下是引用永夜的极光在2007-11-8 15:46:57的发言:
我的电脑从0数到9999居然要3秒半。。。。

//---------------------------------------------------------------------------


DEV-C++


[此贴子已经被作者于2007-11-8 15:59:59编辑过]


----------------解决方案--------------------------------------------------------
刚才的3.59s是vc6的,我用dev-cpp跑了一次,3.2s

这个电脑还真不是一般的慢。。。
----------------解决方案--------------------------------------------------------

我跑完用了7秒多。


----------------解决方案--------------------------------------------------------
你们可以将结果导入到一个txt文件,而不是在控制台上打印出来:
比如程序名是 prime.exe
可以这样运行:
prime >out.txt
这样时间主要花在计算上面,可以检验程序的效率了.


1-1000000000以内的回文数应该有
90000+9000+9000+900+900+90+90+9+9
=109998个

看来是不多

这个数字至少还可以减少3/4
----------------解决方案--------------------------------------------------------

19楼:

int main(void)
{
long int data=MIN;
while(data<=MAX)
{
if(sushu(data))
{
printf("%ld\n",data); /* 你的程序,相当于只判断了最后一个素数是不是回文吧... */
data=nexthuiwen(data);
}
}
return 0;
}


----------------解决方案--------------------------------------------------------
回27楼:

你写的和我的程序不一样哦。

能把眼睛擦亮一点吗?

差点被你骗了。

[此贴子已经被作者于2007-11-8 19:03:08编辑过]


----------------解决方案--------------------------------------------------------
回27楼:

按照你的写法,会进入死循环的。
----------------解决方案--------------------------------------------------------

修正了一下

在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;
}


----------------解决方案--------------------------------------------------------
  相关解决方案