欧拉计划001 100万以内的循环质数

题目描述:

我们称 197 为一个循环质数,因为它的所有轮转形式:197, 971 和 719 都是质数。 100 以下有 13 个这样的质数: 2, 3, 5, 7, 11, 13, 17, 31, 37, 71, 73, 79, 和 97. 100 万以下有多少个循环质数?

解题思路:

55个:2 3 5 7 11 13 17 31 37 71 73 79 97 113 131 197 199 311 337 373 719 733 919 971 991 1193 1931 3119 3779 7793 7937 9311 9377 11939 19391 19937 37199 39119 71993 91193 93719 93911 99371 193939 199933 319993 331999 391939 393919 919393 933199 939193 939391 993319 999331
暴力求解,先用素数筛法把100万以内的素数求出来。然后判断循环之后的数是否为素数。这里直到n的位数之后把n的最低位拿到最高位即可。

程序代码:

#include <stdio.h>
#include <math.h>
#include <string.h>
#define N 1000010
int a[8],b[N];

void prime(int n){      //素数筛法 
    int i,j,m;
    for(i=1;i<n;i++)
        b[i]=1;
    b[0]=b[1]=0;
    m=(int)sqrt(n);
    for(i=2;i<=m;i++)
        if(b[i])
            for(j=2*i;j<=n;j+=i)
                b[j]=0;
    return ;
}
int f(int n){
    int i,j,k,m;
    memset(a,0,sizeof(a));  //j表示n的位数 
    j=0;m=n;
    while(m){
        a[j++]=m%10;
        m/=10;
    }j--;k=1;
    for(i=1;i<=j;i++)
        k*=10;
    while(j--){
        n=n%10*k+n/10;      //n进行轮转变换 
        if(!b[n])
            return 0;
    }
    return 1;
}

int main(){
    int i,k=0;
    prime(N);
    for(i=1;i<1000000;i++)
        if(b[i])
            if(f(i))
                k++,printf("%d ",i); 
    printf("%d\n",k);
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值