project euler problem 35求一个数的所有循环数都是素数的总共有多少个
这题刚开始想到的是怎么求出这些循环数,然后求出来以后判断就容易多了。但是刚开始想的是用取模和相除的求出的循环数,但是有点麻烦,而且程序总有点问题,所以我就想了另外的一个思路。以前记得做题的时候有道题也是关于循环数的,而循环数可以先把它变成字符串,然后这个字符串再连接自己的字符串,如:15234,连接后为:1523415234,然后就可以知道这些循环数了,即第二个数为从第二位取5个数为:52341,第三个数从第三位取5个数为:23415……等等。所以我也可以把书题目中的数化为字符串,然后再连接后,求循环数就容易多了。
#include <iostream>#include <map>#include <deque>#include <queue>#include <stack>#include <string>#include <cstring>#include <cstdio>#include <cmath>#include <algorithm>#include <map>#include <set>using namespace std;int s[1000010]= {0},z[1000010]= {0};int main(){ int i,j,sum=13; for(i=2; i<=1000010; i++) if(!s[i]) { for(j=2*i; j<=1000010; j+=i) //素数打表 s[j]=1; } for(i=100; i<1000000; i++) //暴力搜索 { if(s[i]||z[i]) continue; char str[50],st[50]; itoa(i,st,10); //化为字符串 int l=strlen(st); strcpy(str,st); strcat(str,st); //连接自己为一个字符串 int q=0,t[50]; for(j=1; j<l; j++) { int a=0,k=1; for(int p=j; p<j+l; p++) a+=(str[p]-'0')*((int)pow(10.0,l-(k++))); //用这个循环求出下一个循环数 t[q++]=a; z[a]=1; //这个数求出来后,到i的下一个循环就用不到了,所以标记一下,以节约时间 if(s[a]==0) continue; //如果是这个数是素数,则继续 else break; } if(j==l) { sum+=l; cout<<i<<' '; for(int y=0;y<q;y++) cout<<t[y]<<' '; //我主要想看这些数具体是哪些数我才输出的,如果不想看这些数,这几句都可以省了 cout<<endl; } } cout<<sum<<endl; return 0;}