PAT-B 1007. 素数对猜想
2016-04-27 19:24
295 查看
题目内容:
让我们定义 dnd_n 为:dn=pn+1−pnd_n = p_{n+1} - p_n,其中 pip_i 是第ii个素数。显然有 d1=1d_1=1 且对于n>1n>1有 dnd_n 是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。现给定任意正整数N<105N < 10^5,请计算不超过NN的满足猜想的素数对的个数。
输入格式:每个测试输入包含1个测试用例,给出正整数N。
输出格式:每个测试用例的输出占一行,不超过N的满足猜想的素数对的个数。
输入样例:
20
输出样例:
4
思路分析:
本题先根据给定的正整数N,生成包含所有在1–N之间的素数的列表。然后根据生成的列表,查找是否有差为2的相邻两个素数,并计数。
生成素数表的方法:
根据唯一分解定理:任何合数都可以分解为若干个素数的乘积,所以对于任意的正整数n,只要可以不被所有比他小的素数整除,即可证明n是素数。
合数分解得到的若干素数中,最大值不会超过合数的平方根,所以验证到 list[i] * list[i] <= n 就可以了.
因为所有2得倍数都不是素数,所以验证时 i递增2 ,预设2为素数,验证从3开始。
代码:
#include <stdio.h> int is_prime(int n, int list[]) { for (int i = 0; list[i] * list[i] <= n; i++) // list[i] * list[i] <= n时退出循环 if (n % list[i] == 0) // 验证能否被素数表中的数整除 return 0; return 1; } int generate_prime_list(int n, int list[]) { int m = 1; for (int i = 3; i <= n; i += 2) // 从3开始验证 if (is_prime(i, list)) list[m++] = i; // m为已经生成的素数数量 return m; } int main() { int n, size_of_list, prime_couple = 0; int prime_list[10000] = {2}; // 预设2为素数表中的第一个数 scanf("%d", &n); size_of_list = generate_prime_list(n, prime_list); for (int i = 1; i < size_of_list; i++) if (prime_list[i] - prime_list[i - 1] == 2) prime_couple++; printf("%d", prime_couple); return 0; }
点这里进入试题网页
相关文章推荐
- 关于AS中使用第三方库vitamio的注意事项
- 【密码学】云的MD5破解
- 矩形嵌套 ————DAG(有向无环图)上的动态规划
- 判断文本框还有多少文字的插件
- 重新学javaweb----EL表达式(2)--TLD
- 游戏基本概念
- J2SE语言--百度百科
- Android获取剪贴板内容
- mysql的alter
- mysql的alter
- Java异常处理(1)
- hdu 2112HDU Today 最短路+map
- 【数据结构】浅谈算法和数据结构:优先队列和堆排序
- Tomcat中server.xml参数说明
- php抓取网页内容汇总
- EM css
- POJ 1125 Stockbroker Grapevine(Floyd)
- 创建外键的前提
- 创建外键的前提
- 20、线程初相识