今天下午看到这么一个题

找出 1 亿以内的回文质数

很自然的思路就是素数筛,然后验证回文性质

#include

#include

#include

#define TOTAL 100000000

using namespace std;

bool is_prime[TOTAL];

void Sieve_of_Eratosthenes()

{

memset(is_prime, 1, sizeof(is_prime));

is_prime[0] = is_prime[1] = false;

for (int i=2; i

{

if (is_prime[i])

{

for (int j=i*i; j

{

is_prime[j] = false;

}

}

}

}

void test_palin()

{

for (int i=2; i

{

if (is_prime[i])

{

int cpy = i, sum;

for (sum=0; cpy!=0; cpy/=10)

{

sum = sum*10 + cpy%10;

}

if (sum == i)

{

printf("%dn", i);

}

}

}

}

int main()

{

Sieve_of_Eratosthenes();

test_palin();

printf("%lfn", (double)clock()/CLOCKS_PER_SEC);

return 0;

}

上面这个素数筛在我的电脑上跑需要 4.07 秒,加上验证函数,耗时在 5.0 秒左右波动

思路是没错,但是略慢了,可以看到主要时间耗在打表上,上网翻看了一下,http://wenku.baidu.com/view/8e…,别人的思路不是打表,而是先判断回文,再判断质数,而是质数判断就直接穷举去除,看到他的最好的方法方法四是 0.5 秒,于是照着这个思路,重新搞,简单分析可以知道,任何一个 k 位正整数都可以产生一个 2*k 位和一个 2*k-1 位两个回文整数,例如,12 可以产生 121 和 1221 这两个,然后我们又知道,1 亿以内最大的数就是 99999999 了,8 个 9,那产生的时候最大也就 4 位数就可以了,照着这个思路,得到如下代码

#include

#include

#include

int is_prime(int x)

{

for (int i=2; i

{

if (x%i == 0)

{

return 0;

}

}

return 1;

}

void gener_palin()

{

for (int i=1; i<10000; i++)

{

// 根据 k 位数 i 产生 2*k 位的回文数

int cpy = i, sum;

for (sum=i; cpy!=0; cpy/=10)

{

sum = sum*10 + cpy%10;

}

if (is_prime(sum))

{

printf("%dn", sum);

}

// 产生 2*k-1 位的回文数

cpy = i/10;

for (sum=i; cpy!=0; cpy/=10)

{

sum = sum*10 + cpy%10;

}

if (is_prime(sum))

{

printf("%dn", sum);

}

}

}

int main()

{

gener_palin();

printf("%lfn", (double)clock()/CLOCKS_PER_SEC);

return 0;

}

这个代码在我的机子上可以跑到 0.25 秒,如图

根据经验,卷屏输出是耗时大户,把 29 和 40 行注释掉,可以跑到 0.03 秒

1亿以内素数的个数_1亿以内的回文质数相关推荐

  1. P1217 [USACO1.5]回文质数 Prime Palindromes(素数筛法/打表)

    P1217 [USACO1.5]回文质数 Prime Palindromes(素数筛法/打表) 一:埃氏筛(时间复杂度--nloglogn) 重点:一个数x是合数,则它的倍数也是合数 //用埃氏筛生成 ...

  2. 【素数】P1217 [USACO1.5]回文质数 Prime Palindromes

    https://www.luogu.com.cn/problem/P1217 考点:素数.回文.二分.打表 题意: 找出5到1e8的回文素数. 解法: 直接暴力遍历1亿次必定超时,可以用打表法... ...

  3. java 回文素数_java实现回文质数

    题目描述 因为151既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数. 写一个程序来找出范围[a,b](5 <= a < b <= 100,000 ...

  4. 1亿以内素数的个数_神奇的素数

    数学里面最有趣的问题可能就得说是素数了.世界上最难的问题很多都与素数有关,而且素数又是如此简单的一个概念,只要是学过乘除法的人都能理解什么是素数.如果评选一个非常简单但又极端复杂的数学概念,估计非素数 ...

  5. 1亿以内素数的个数_ghpython_素数

    今天咱们继续来看老潘微博里的一个python小案例,求1-200以内的所有素数,所谓素数,就是咱高中里说的质数,只能被数字1和其自身整除.且大于1的自然数. 那么就只需要遍历1-200以内的每一个数, ...

  6. Java12个小练习_打印三角形_素数_利率_水仙花数_回文数

    Java基础day6作业 1.一个足球队在寻找年龄在10岁到12岁的小女孩(包括10岁和12岁)加入.编写程序,询问用户的性别(1表示男性,0表示女性)和年龄,然后显示一条消息指出这个人是否可以加入球 ...

  7. 【作业】随机数+参数可变的方法+实验任务(输出素数+使用递归,判断是否为回文+统计一篇英语问斩单词出现频率)...

    (1)随机数 取余的m很大可以保证随机的更彻底,更不容易重复 1 import java.util.Scanner; 2 public class Text_001 3 { 4 5 public st ...

  8. 1亿以内素数的个数_算法|找出给定范围的所有素数

    本文参考C++版本:如何高效判定.筛选素数 给定n,我们如何输出n以内(不含n)的所有素数? 使用Python,完成函数体,要求返回n以内的素数个数和这些素数. def countPrimes(n): ...

  9. python 判断并记录1000以内素数的个数及具体数值

    一.素数的定义 素数:在正整数范围内,大于1并且只有1和自身两个约数的数. 二.python实现 1.代码 (示例:1000以内的素数判断) n = 1000 #判断的范围 L = [] #记录数值 ...

最新文章

  1. 微信视频号聊天室技术介绍
  2. Android打Path的方法
  3. HGST:中国将成为新云端运算大国
  4. 2019年春季学期第四周作业
  5. UVA532 - Dungeon Master(裸BFS)
  6. 金立软件测试员,6GB运存有多强 金立M2017打开APP测试
  7. java.lang.IllegalStateException: getOutputStream() has already been called for this response
  8. mysql all privilege权限
  9. 故宫也在拼多多卖货!故宫文具将入驻拼多多开设旗舰店!
  10. swift简介(东拼西凑,看看就的了)
  11. app内嵌h5页面在ios手机端滑动卡顿的解决方法
  12. 学生管理系统(C语言)简单版
  13. python如何将批量txt文本转成批量word格式
  14. 偷窥JCache API(JSR 107)
  15. 身份证前6位城市代码
  16. ltspice导入spice模型_LTspice 怎么自建 MOSFET 模型
  17. 安川服务器报b33怎么维修,驻马店安川伺服报警B33故障维修
  18. 广东省计算机媒体大赛,年广东省大学生计算机设计大赛.doc
  19. 计算机网络实验--Cisco Packet Tracer 实验
  20. 分享一个超级狠的面试题与经验

热门文章

  1. 测试观察力软件,测一测你的观察力
  2. 手机淘宝Android客户端架构
  3. xbox录制视频没声音_如何在Xbox One上截图和录制视频
  4. 二维数组的各种表达方法
  5. 如何处理max透明树叶贴图渲染白边问题
  6. Word艺术字怎么设置才美观
  7. 微信小程序开发入门(连载)—— 认识微信小程序
  8. 破解无线网络连接密匙
  9. android相关问题、网摘集锦
  10. PHP-企业微信服务器回调配置