从零单排PAT1007. 素数对猜想

来源:互联网 发布:java并发线程好书 编辑:程序博客网 时间:2024/04/28 10:45

题目要求:

让我们定义 dn 为:dn = pn+1 - pn,其中 pi 是第i个素数。显然有 d1=1 且对于n>1有 dn 是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。

现给定任意正整数N (< 105),请计算不超过N的满足猜想的素数对的个数。

输入格式:每个测试输入包含1个测试用例,给出正整数N。

输出格式:每个测试用例的输出占一行,不超过N的满足猜想的素数对的个数。

输入样例:
20
输出样例:
4

代码:

#include <iostream>#include <cmath>#include <vector>using namespace std;//判断素数函数,返回1表示是素数,返回0不是素数int judge_sushu(int num){if(num == 1)return false;else if(num == 2)return true;else{for(int i = 2;i*i<=num;i++)  //避免使用开方,除数不允许用0,循环从2开始{if(num%i == 0)  //如果能够被整除,说明不是素数{return false;}}return true;}}int main(){int n;int count = 0; //用于计数int pre_i = -2;cin >> n;for(int i = 1;i<=n;i++)  //可自动+2进行优化{if(true == judge_sushu(i)){if(2 == i - pre_i){count ++;}pre_i =i;    //刷新赋值}}cout << count <<endl;system("pause");return 0;}/**/

一开始就做出了结果,但是一直没有通过,很困惑,逻辑肯定没有错,那就是边界条件出了问题。

边界一个是2,3开始,其实1是不需要进行判断,除数也只需要从2开始(用1那就悲剧了)。

判断素数最常见的方法是从1遍历到它本身,但是由于对称性,所以我们只需要遍历到这个数的开方就可以。

判断素数的算法不止这点,以后的博文会写出,让我们回到这道题目。

我错误是因为边界出了问题,一是2的判断,二是最大的数判断,因为我常用遍历数组的方式for(i=0;i<n;i++),所以,这样只能遍历到n-1,所以需要遍历到n就必须改成for(i=0;i<n+1;i++)。

虽然这是一个很简单的小问题,但是说明我的逻辑还不够严谨,尤其对于边界条件没有考虑清楚。这是我必须努力提升的地方。


0 0