1亿以内素数的个数_1亿以内的回文质数
今天下午看到这么一个题
找出 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亿以内的回文质数相关推荐
- P1217 [USACO1.5]回文质数 Prime Palindromes(素数筛法/打表)
P1217 [USACO1.5]回文质数 Prime Palindromes(素数筛法/打表) 一:埃氏筛(时间复杂度--nloglogn) 重点:一个数x是合数,则它的倍数也是合数 //用埃氏筛生成 ...
- 【素数】P1217 [USACO1.5]回文质数 Prime Palindromes
https://www.luogu.com.cn/problem/P1217 考点:素数.回文.二分.打表 题意: 找出5到1e8的回文素数. 解法: 直接暴力遍历1亿次必定超时,可以用打表法... ...
- java 回文素数_java实现回文质数
题目描述 因为151既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数. 写一个程序来找出范围[a,b](5 <= a < b <= 100,000 ...
- 1亿以内素数的个数_神奇的素数
数学里面最有趣的问题可能就得说是素数了.世界上最难的问题很多都与素数有关,而且素数又是如此简单的一个概念,只要是学过乘除法的人都能理解什么是素数.如果评选一个非常简单但又极端复杂的数学概念,估计非素数 ...
- 1亿以内素数的个数_ghpython_素数
今天咱们继续来看老潘微博里的一个python小案例,求1-200以内的所有素数,所谓素数,就是咱高中里说的质数,只能被数字1和其自身整除.且大于1的自然数. 那么就只需要遍历1-200以内的每一个数, ...
- Java12个小练习_打印三角形_素数_利率_水仙花数_回文数
Java基础day6作业 1.一个足球队在寻找年龄在10岁到12岁的小女孩(包括10岁和12岁)加入.编写程序,询问用户的性别(1表示男性,0表示女性)和年龄,然后显示一条消息指出这个人是否可以加入球 ...
- 【作业】随机数+参数可变的方法+实验任务(输出素数+使用递归,判断是否为回文+统计一篇英语问斩单词出现频率)...
(1)随机数 取余的m很大可以保证随机的更彻底,更不容易重复 1 import java.util.Scanner; 2 public class Text_001 3 { 4 5 public st ...
- 1亿以内素数的个数_算法|找出给定范围的所有素数
本文参考C++版本:如何高效判定.筛选素数 给定n,我们如何输出n以内(不含n)的所有素数? 使用Python,完成函数体,要求返回n以内的素数个数和这些素数. def countPrimes(n): ...
- python 判断并记录1000以内素数的个数及具体数值
一.素数的定义 素数:在正整数范围内,大于1并且只有1和自身两个约数的数. 二.python实现 1.代码 (示例:1000以内的素数判断) n = 1000 #判断的范围 L = [] #记录数值 ...
最新文章
- 微信视频号聊天室技术介绍
- Android打Path的方法
- HGST:中国将成为新云端运算大国
- 2019年春季学期第四周作业
- UVA532 - Dungeon Master(裸BFS)
- 金立软件测试员,6GB运存有多强 金立M2017打开APP测试
- java.lang.IllegalStateException: getOutputStream() has already been called for this response
- mysql all privilege权限
- 故宫也在拼多多卖货!故宫文具将入驻拼多多开设旗舰店!
- swift简介(东拼西凑,看看就的了)
- app内嵌h5页面在ios手机端滑动卡顿的解决方法
- 学生管理系统(C语言)简单版
- python如何将批量txt文本转成批量word格式
- 偷窥JCache API(JSR 107)
- 身份证前6位城市代码
- ltspice导入spice模型_LTspice 怎么自建 MOSFET 模型
- 安川服务器报b33怎么维修,驻马店安川伺服报警B33故障维修
- 广东省计算机媒体大赛,年广东省大学生计算机设计大赛.doc
- 计算机网络实验--Cisco Packet Tracer 实验
- 分享一个超级狠的面试题与经验