虚心求解。。。寻找回文质数,当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作为参数数据类型,不过你写的判定算法需要做优化,降低程序运行的时间复杂度。
