求救 快速找回文素数
输入一个数字,表示测试用例,然后输入a,b表示a到b之间的回文素数数字
然后输出他们
程序有运算时间限制
#include<stdio.h>
#include<string.h>
#include<math.h> int lookforback(int i);
int lookforsushu(int i); main()
{
int k,i,m,n,j;
scanf("%d",&k);
for(i=0;i<k;i++)
{
scanf("%d %d",&m,&n);
if(m%2==0)//排除被2整除的
m++;
for(j=m;j<n;j+=2)
{
if(lookforback(j))//寻找回文
if(lookforsushu(j))// 寻找素数
printf("%d\n",j);
}
}
} int lookforback(int i)
{
int j,num[100],k;
int * p=num,sum;
for(j=0;i!=0;j++)
{
num[j]=i%10;
sum+=i;
i/=10;
}
if(sum%3==0)//各位数字被3整除的排除
return 0;
j--;
for(k=0;k<=j/2;k++)//判断是否为回文
{
if(*(p+k)!=*(p+j-k))
return 0;
}
return 1;
} int lookforsushu(int i)
{
int j;
for(j=2;j<sqrt(i);j++)
{
if(i%j==0)
return 0;
}
return 1;
}
唯一改的地方就是我这是判断回文,上网查找方法,听见一个人说,是生成回文,而不是判断,
但是不明白怎么生成指定范围的回文.
[解决办法]
给出一个尚未验证过的回文算法(因为家里机器没有开发环境,实在是没法验证,见谅)。尽管我已经很小心了,还是可能留有错误在里面。
该算法用于生成回文数字,每次调用getPalindromNumber函数时会得到一个比参数更大的最小回文整数。
- C/C++ code
#include <math.h>int getIntLong(int x){ int c=0; do { c++; x%=10; }while(x>0); return c;}// 该函数生成一个比参数大的最小回文数字int getPalindromeNumber(int x){ int c,v,y; // c用于存储参数x的位数,v存储回文数字,y存储尚未复制数字。 c=getIntLong(x); int halfLong=(c+1)%2; // 用于存储参数的半长度,小数部分舍入。 // 下面生成回文 v=y=(x%(int)pow(10.0,c-halfLong))+1; // 将参数位长折半且增量。 for (int i=1;i<=halfLong;i++) { if (i!=1||c==(halfLong+halfLong)) v=10*v+y-(y%10)*10; // 复制数码到尾部,当参数位长为奇数时不复制个位数码。 y=y%10; } return v;}