题目描述:
我们称 197 为一个循环质数,因为它的所有轮转形式:197, 971 和 719 都是质数。 100 以下有 13 个这样的质数: 2, 3, 5, 7, 11, 13, 17, 31, 37, 71, 73, 79, 和 97. 100 万以下有多少个循环质数?
解题思路:
55个:2 3 5 7 11 13 17 31 37 71 73 79 97 113 131 197 199 311 337 373 719 733 919 971 991 1193 1931 3119 3779 7793 7937 9311 9377 11939 19391 19937 37199 39119 71993 91193 93719 93911 99371 193939 199933 319993 331999 391939 393919 919393 933199 939193 939391 993319 999331
暴力求解,先用素数筛法把100万以内的素数求出来。然后判断循环之后的数是否为素数。这里直到n的位数之后把n的最低位拿到最高位即可。
程序代码:
#include <stdio.h>
#include <math.h>
#include <string.h>
#define N 1000010
int a[8],b[N];
void prime(int n){ //素数筛法
int i,j,m;
for(i=1;i<n;i++)
b[i]=1;
b[0]=b[1]=0;
m=(int)sqrt(n);
for(i=2;i<=m;i++)
if(b[i])
for(j=2*i;j<=n;j+=i)
b[j]=0;
return ;
}
int f(int n){
int i,j,k,m;
memset(a,0,sizeof(a)); //j表示n的位数
j=0;m=n;
while(m){
a[j++]=m%10;
m/=10;
}j--;k=1;
for(i=1;i<=j;i++)
k*=10;
while(j--){
n=n%10*k+n/10; //n进行轮转变换
if(!b[n])
return 0;
}
return 1;
}
int main(){
int i,k=0;
prime(N);
for(i=1;i<1000000;i++)
if(b[i])
if(f(i))
k++,printf("%d ",i);
printf("%d\n",k);
return 0;
}