读书人

project euler problem 35数的所有循环

发布时间: 2013-10-21 17:03:30 作者: rapoo

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

读书人网 >编程

热点推荐