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;
}