循环素数:循环素数是一种特殊的素数,即对一个素数循环移位后仍然是素数。比如1193是个素数,对它循环移位后发现:1931,9311,3119也都是素数,具有这样特征的数就是循环素数。
求出所有五位数的循环素数:
整体思路是这样的:
1.找出所有五位数的素数
2.将它们存入一个数组
3.对数组(其中的数已经是素数)中的每个数,判断它是否为循环素数
判断流程:
1.取出每个数
2.取出每个数的个位、十位、百位、千位、万位。
3.由上述五个数还有四种组合
4.判断它们四个数是否全为素数,如果是,那么取出的这个数是循环素数,如果有一个不满足,即不是。
代码全文:
#include <stdio.h>
void main()
{
int a[10000]; //定义一个数组,用来存放五位数的素数
int u[50000]; //再定义一个数组,用来存放满足条件的素数,即循环素数
int i,y=0,o=0; //初始化变量值
//找出所有五位数中的素数
for(i=10000;i<=99999;i++)
{
if(isprime(i)==1)
{
// printf("%d,",i);
a[y]=i; //找到后将它存入a数组
y++;
}
}
int j=0,k=0;
printf("取出素数完毕,count=%d\n",y); //看看找到了多少个五位数的素数
y=0;
//下面是对每个数进行判断,看其余四个数是否都为素数
while(a[y]!=0)
{
int t=a[y]; //先把每个数取出来
//然后取出每一位数
int g=t%10; //个
int s=(t/10)%10;//十
int b=(t/100)%10;//百
int q=(t/1000)%10;//千
int w=t/10000;//万
//共有四种其它组合
//t=wqbsg t2=qbsgw t3=bsgwq t4=sgwqb t5=gwqbs
int t2=q*10000+b*1000+s*100+g*10+w;
int t3=b*10000+s*1000+g*100+w*10+q;
int t4=s*10000+g*1000+w*100+q*10+b;
int t5=g*10000+w*1000+q*100+b*10+s;
//判断它们是否为素数
int flag2=isprime(t2);
int flag3=isprime(t3);
int flag4=isprime(t4);
int flag5=isprime(t5);
//int u[5000];
if((flag2==1)&&(flag3==1)&&(flag4==1)&&(flag5==1))
{
printf("a[%d]=%d\n",y,a[y]); //输出满足条件的a数组中的数,确认
u[j]=a[y]; //存入u数组
printf("u[%d]=%d\n",j,u[j]); //确认一下,看看是否存入成功
j++;
}
y++; //再判断下一个数
}
printf("j=%d\n",j);
int h=j;
//printf("h=%d\n",h);
printf("OK");
printf("正在输出u数组\n");
for(j=0;j<=h;j++){
if(u[j]!=0) printf("j=%d,u[%d]=%d\n",j,j,u[j]);
}
printf("OK");
}
int isprime(int n)
{
int i;
if(n>10000)
{
for(i=2;i<=n/2;i++)
{
if(n%i==0)
return 0; //不是素数
}
return 1; //是素数
}
return 0;
}
总结:
这个解法太暴力,不够巧,代码量也很冗长,不简洁,容易出错。
再看一个大聪明写的:
#include <stdio.h>
void main(){
int a=0,i,j,t,b;
for(i=10000;i<100000;i++){
b=i;
loop: for(t=2;t<b;t++){
a=b%t;
if(a==0) break;
}if(a!=0){
b=(b*10)%100000+(b*10)/100000;
if(b>10000){
j++;
if(j>5){
printf("#%d#\n",i);
}else goto loop;
}else a=0;
}j=0;
}
}