24小时热门版块排行榜    

查看: 2074  |  回复: 16
本帖产生 4 个 程序强帖 ,点击这里进行查看
当前只显示满足指定条件的回帖,点击这里查看本话题的所有回帖

holmescn

金虫 (正式写手)

[交流] Euler 工程 第三十五题:循环质数 已有4人参与

197 这个质数很特别,因为1, 9, 7这三个数的循环排列也是质数。(197,719,971)

100以下有这样性质的质数有13个:2, 3, 5, 7, 11, 13, 17, 31, 37, 71, 73, 79, 97.

那么100百万以下这样的数有多少个呢?
回复此楼
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

sudo

木虫 (正式写手)

★ ★ ★ ★
小木虫(金币+0.5):给个红包,谢谢回帖
dubo(金币+1): 欢迎常来程序语言版讨论 2011-07-07 14:44:14
余泽成(金币+2, 程序强帖+1): 鼓励交流! 2011-07-11 20:37:14
=w=竟然热感冒了,那么就放下手头工作,来玩一下吧~~
CODE:
#include

#define MAXNUM 1000000

unsigned char notPrime[MAXNUM];
int prime[100000]; //素数个数的估计方法:pi(x) ~ x / ln(x)

int main(){
    int i, j, countPrime;
    int digits, nextBase, currentBase;
    int temp;
    int total=0; //最终结果的计数器

    for(i=2; i         if(notPrime[i]) continue;
        for(j=i+i; j             notPrime[j] = 1;
        }
    } //筛法求素数表

    for(countPrime=0, i=2; i         if(!notPrime[i]){
            prime[countPrime] = i;
            countPrime ++;
        }
    } //把素数放到数组中

    digits = 1;
    currentBase = 1;
    nextBase = 10;
    for(i=0; i         temp = prime[i];

        if(temp/nextBase>0){
            digits++;
            currentBase = nextBase;
            nextBase *= 10;
        } //判定当前十进制数的位数

        for(j=1; j             temp = temp/10 + (temp%10)*currentBase; //把个位数放到最高位
            if(notPrime[temp]) break;
        }

        if(j==digits) total++; //如果循环数都能通过测试
    }

    printf("Total = %d\n", total);

    return 0;
}

7楼2011-07-07 10:27:10
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
查看全部 17 个回答

huycwork

金虫 (著名写手)

★ ★
小木虫(金币+0.5):给个红包,谢谢回帖
dubo(金币+1): 欢迎常来程序语言版讨论 2011-07-07 14:43:38
这个题目带有强烈的多线程暗示呀~
漩涡的中心有一块空地,空空的。
2楼2011-07-06 23:31:27
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

libralibra

至尊木虫 (著名写手)

骠骑将军

★ ★
小木虫(金币+0.5):给个红包,谢谢回帖
dubo(金币+1): 欢迎常来程序语言版讨论 2011-07-07 14:43:45
matlab使用了primes函数函数不快哦
CODE:
% Elapsed time is 49.161032 seconds.
% ans =
%     55
function result = euler35()
tic;
pm = primes(1000000);
result = 0;
for i=1:length(pm)
    x = pm(i);
    si = num2str(pm(i));
    for j=2:length(si)
        x(end+1) = str2double([si(j:end),si(1:j-1)]);
    end
    x = unique(x);
    if any(~ismember(x,pm)) % use any() is twice faster than all()
        continue;
    end
    result = result+1;
end
toc;
end

matlab/VB/python/c++/Java写程序请发QQ邮件:790404545@qq.com
3楼2011-07-07 00:11:50
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

libralibra

至尊木虫 (著名写手)

骠骑将军

★ ★ ★ ★
小木虫(金币+0.5):给个红包,谢谢回帖
dubo(金币+1): 欢迎常来程序语言版讨论 2011-07-07 14:43:53
余泽成(金币+2, 程序强帖+1): 鼓励交流! 2011-07-11 20:35:50
c++的效率还是高
不过初学c++,谁知道还有什么数字,字符串转换的高效方法吗?
第二个子函数中计算rotation number的办法好丑陋
CODE:
#include
using namespace std;

// 素数筛: 返回0-stop的数组,素数位置为1,其余位置为0
// 从第一个非素数开始,直到大于stop的平方根
// 方法是挨着划去当前数的倍数
int *primes(int stop)
{
    int *numlist = new int[stop+1];
    int i;

    for(i=0;i<=stop;++i)
    {
        if(i<2)
            numlist[i] = 0;
        else
            numlist[i] = i;
    }

    i = 2;
    while(i*i<=stop)
    {
        if(numlist[i]>0)
        {
            for(int j=i+1;j<=stop;++j)
                if(numlist[j]%i==0)
                    numlist[j] = 0;
        }
        i++;
    }

    return numlist;
}

// 判断所有循环是否都是素数
bool checkRotation(int n, int *pmlist)
{
    bool flag = true;
    if(n<10) return flag; // 小于10,直接返回true

    char strnum[7] = ""; // <=1,000,000,7位就够
    sprintf(strnum,"%d",n); // 转为字符串

    int len = strlen(strnum); // 长度
    int curNum,i,j;

    char sNewNum[7] = ""; // 旋转数的字符串形式

    for(i=1;i     {
        // 从位置i开始的旋转数
        for(j=0;j         {
            if(i+j                 sNewNum[j] = strnum[i+j];
            else
                sNewNum[j] = strnum[i+j-len];
        }

        sscanf(sNewNum,"%d",&curNum); // 转为数字
        //cout<
        // 判断是否是素数
        if(pmlist[curNum]==0)
        {
            flag = false;
            break;
        }
    }

    return flag;
}

// euler35
int main(int args, char* argv[])
{
    int stop = 1000000;
    int i,num = 0;
    int *pmlist = primes(stop);

    for(i=0;i<=stop;++i)
        if(pmlist[i]>0 && checkRotation(i,pmlist))
            num++;

    cout<<"小于 "<     return 0;
}

结果
CODE:
//小于 1000000 满足条件的数有: 55 个.
//Process returned 0 (0x0)   execution time : 1.703 s
//Press any key to continue.

matlab/VB/python/c++/Java写程序请发QQ邮件:790404545@qq.com
4楼2011-07-07 03:10:36
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
普通表情 高级回复 (可上传附件)
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[基金申请] 欢迎发来filecode的Mz6后的代码验证其规律 +50 医学老男孩 2026-08-13 109/5450 2026-08-18 16:56 by 医学老男孩
[基金申请] 重要消息,中午系统在维护 +9 yuleib84 2026-08-18 10/500 2026-08-18 16:52 by archvillain
[教师之家] 两姐妹,一个辛辛苦苦30岁工作当大学教师,另一个23岁就工作当开车教练 +3 瞬息宇宙 2026-08-11 7/350 2026-08-18 16:42 by LNP@mRNA
[基金申请] 明天放榜? +4 Shxjjxjkx 2026-08-18 4/200 2026-08-18 15:59 by abcabc1133
[论文投稿] 投稿咨询 +4 wwm09 2026-08-17 6/300 2026-08-18 15:36 by wwm09
[基金申请] 时间戳又变了8-15 +14 archvillain 2026-08-15 26/1300 2026-08-18 13:37 by phantomgost
[基金申请] 今天维护系统维护 祝所有人 高中 +8 gjjjzhong 2026-08-18 9/450 2026-08-18 13:01 by 家与远方
[基金申请] 哪位老哥知道今年的国自然具体哪一天放榜? +13 Ldrop2023 2026-08-13 16/800 2026-08-18 12:25 by 淀粉搬运工
[基金申请] 2027广东省杰青 +3 奶牛小黑 2026-08-15 8/400 2026-08-18 11:47 by gltch
[基金申请] 快农历七夕节了,轻松一下,男人悄悄话,女施主请不要进来。 +4 Tide man 2026-08-14 5/250 2026-08-18 11:35 by Tide man
[基金申请] 93BebMhtakh前后11位开头都是大写 +4 且听虎啸 2026-08-17 5/250 2026-08-18 00:49 by 蔡棒棒菂
[基金申请] 感觉是下周放榜了 +6 angus9576 2026-08-17 11/550 2026-08-17 23:57 by angus9576
[基金申请] filecode=后面第一个是大写字母 +8 wangze12014 2026-08-14 10/500 2026-08-17 17:05 by xter9665
[基金申请] 咱们一起用铁证分析2026国家社科基金中标与否 +7 启萌科技 2026-08-12 26/1300 2026-08-16 12:35 by 启萌科技
[精细化工] 招聘 金属平磨液,抛光液研发工程师 +3 小天0311 2026-08-14 3/150 2026-08-16 07:31 by H9PLUS
[基金申请] 各位道友,我要去昆明玩几天,回来见。 +7 Tide man 2026-08-14 8/400 2026-08-15 01:11 by arzu_hma
[基金申请] 是这周出结果还是下周出结果? +4 yuleib84 2026-08-11 4/200 2026-08-14 23:05 by lfy8008
[基金申请] 重要来源:本周末出结果 +10 瞬息宇宙 2026-08-12 10/500 2026-08-13 15:46 by likettle
[基金申请] 不应该看fileCode +7 且听虎啸 2026-08-12 9/450 2026-08-13 14:27 by flydreamws
[基金申请] 结合人工智能,周易传统文化,filecode打分制来了,3分以上希望很大。 +3 Tide man 2026-08-12 4/200 2026-08-13 08:35 by ZJTJZ
信息提示
请填处理意见