首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

虚心求解。寻找回文质数,当b较大时,便会出现异常。跪求解决。

2012-02-13 
虚心求解。。。寻找回文质数,当b较大时,便会出现错误。跪求解决。。。描述:因为151既是一个质数又是一个回文数(从

虚心求解。。。寻找回文质数,当b较大时,便会出现错误。跪求解决。。。
描述:

因为151既是一个质数又是一个回文数(从左到右和从右到左看是一样的),所以151是回文质数.
写一个程序来找出范围[a,b](5<=a<b<=100,000,000间的所有回文质数.

输入:

第一行 两个整数:a和b.

输出:

输出一个回文质数的列表,一行一个.

输入样例:

5 500

输出样例:

5
7
11
101
131
151
181
191
313
353
373
383


以下为鄙人写的小代码,望高手帮助修改,或能提供新思路。不甚感激。

C/C++ code
#include <stdio.h>#include <math.h>int a,b;void scan();void searchpri();void isPal(int*prime,int i);int main(){    scan();    searchpri();    return 0;}void scan(){    scanf("%d%d",&a,&b);}void searchpri(){    int x,m,prime[100000],f=1,i=0;      //此处分配空间大小是否应该改变??但再大时,又回出现无法运行的情况。    for(x=a;x<=b;x++)    {        for(m=2;m<=sqrt(x);m++)        {            if(x%m==0)            {                f=0;                break;            }        }        if(f==0)        {            f=1;        }        else        {            prime[i++]=x;        }    }    prime[i]='\0';    isPal(prime,i);}void isPal(int*prime,int i){    int pal[10];    int x,j=0,k=0,f=1,m,n;    for(j=0;j<i;j++)    {        k=0;        x=prime[j];        while(x!=0)        {            pal[k++]=x%10;            x=x/10;        }        for(m=0,n=k-1;m<n;m++,n--)        {            if(pal[m]!=pal[n])            {                f=0;                break;            }        }        if(f==1)        {            printf("%d\n",prime[j]);        }        else        {            f=1;        }    }}


[解决办法]
由于数据太大,不应该用数组先求出所有素数,而是应该对所要求的数逐个判断。
bool isPrime(int p) {
for(int i = 2; i * i < p; ++i) {
... ...
}
}
[解决办法]
#include<stdio.h>
#include<math.h>
#define N 100000000

int Prime( int n )
{
int k = (int)sqrt(n);
for(int i = 2;i <= k;i ++)
{
if( n%i == 0 )
return 0;
}
return 1;
}
 
int Palind( int n )
{
int a[9];
for(int i = 0;n > 0;i ++,n /= 10)
{
a[i] = n%10;
}
for(int j = 0;j < i/2;j ++)
{
if(a[j] != a[i-1-j])
return 0;
}
return 1;
}

void main()
{
int a,b;

printf("请输入查找范围[a,b](5<=a<b<=100,000,000)\n");
do{
do{
scanf("%d%d",&a,&b);
}while(a>=b);
}while(a<5||b>N);

for(int i = a ; i <= b ; i += 2)
{
if( Prime(i) && Palind(i) )
printf("%d\t",i);
}
}
首先你没必要先将所有素数求出并用数组存起来,这样浪费存储空间,也不好确定数组长度;其次,将代码各个功能更独立模块化(你的函数功能不够独立),思路清晰,同时 Prime(i) && Palind(i) 可以减少不必要的判断(如果不是素数就不需要进行回文数的判断);最后我觉得输输入时没必要用函数单独实现。暂时也没找到更高效的算法。
[解决办法]
用__int64作为参数数据类型,不过你写的判定算法需要做优化,降低程序运行的时间复杂度。

热点排行
Bad Request.