1193是个素数,对它循环移位后发现:
1931,9311,3119也都是素数,这样特征的数叫:循环素数。
你能找出具有这样特征的5位数的循环素数吗?
当然,这样的数字可能有很多,请写出其中最大的一个。
注意:答案是个5位数,不要填写任何多余的内容。
#include<stdio.h>
#include<math.h>
//判断是不是素数
int isprime(int n)
{
int flag=1;//是素数
for(int i=2;i<=sqrt(n);i++)
{
if(n%i==0)
flag=0;
}
return flag;
}
//移位
int shift(int n)
{
int a=n%10;//12345 5*10000+1234
int b=n/10;
return a*10000+b;
}
int main()
{
for(int i=99999;i>=10000;i--)//i 代表5位数
{
int temp=i;
int count=0;//j代表循环5次
for(int j=0;j<5;j++)
{
if(isprime(temp))
{
count++;
temp=shift(temp);
}
}
if(count==5)
{
printf("%d",i);
break;
}
}
return 0;
}
解法二:移位后最后一位数不能是2,4,5,6,8,0,所以只能是1,3,7,9
#include<stdio.h>
#include<math.h>
int map[6]={0};
int num[4]={1,3,7,9};
int ans=0;
long a1,a2,a3,a4,a6,a5,a7;
long sum=0;
long index=1;
long data[1024];//1024=4*4*4*4*4 排列组合 1,3,7,9 共1024种组合
//返回0不是素数,返回1是素数
int checkprime(int n)
{
for(int i=2;i<sqrt(n);i++)
if(n%i==0)
return 0;
return 1;
}
//筛选素数
void check()
{
int temp=map[1]*10000+map[2]*1000+map[3]*100+map[4]*10+map[5];
if(checkprime(temp))
{
data[index]=temp;
index++;
}
}
void dfs(int n)
{
if(n==6)
{
check();
return;
}
for(int i=0;i<4;i++)
{
map[n]=num[i];
dfs(n+1);
}
}
//移位查找 是否是素数。从大到小。满足条件则输出
void find()
{
for(int i=index-1;i>0;i--)
{
long a1=data[i]; //56789
long a2=a1%10*10000+a1/10; //90000+5678=95678
long a3=a2%10*10000+a2/10;
long a4=a3%10*10000+a3/10;
long a5=a4%10*10000+a4/10;
long a6=a5%10*10000+a5/10;
int t=0;
for(int j=0;j<index;j++)
{
if(data[j]==a2)
t++;
if(data[j]==a3)
t++;
if(data[j]==a4)
t++;
if(data[j]==a5)
t++;
}
if(t==4)
{
printf("%d \n", data[i]);
return ;
}
}
}
int main()
{
dfs(1);
find();
return 0;
}