您的位置:首页 > 其它

PAT 1007. 素数对猜想 (20)

2018-01-19 17:33 260 查看
题目概述:

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

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

输入格式:

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

输出格式:

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

输入样例:

20

输出样例:

4

思路:

找出N内的素数

然后判断是否符合猜想

#include<stdio.h>
#include<math.h>

int N;  //range
int prime[10000] = { 0 }; //save all the rang of prime number in this array
int count = 0; //to calculate the number of a prime number
int flag;

int main() {
scanf("%d", &N);

int temp = 0;
for (int i = 2;i <= N;i++) {
flag = 0;
//sqrt(N) is to short of time
for (int j = 2; j < sqrt(N); j++) {
if (j == i)
break;
if (!(i % j))  //it's not a prime number
{
flag++;
break;
}
}
if (!flag) {
prime[temp++] = i; //it's prime number
}
}
for (int i = 0; i <= temp; i++)
{
if (prime[i + 1] - prime[i] == 2)
count++;
}

//to find out the rang of the prime number
//waste too much time
/*for (int i = 2; i <= N+2; i++)
{
flag = 0;
for (int j = 2; j < sqrt(N); j++)
{
if (j == i)
break;
if (!(i % j))
{
flag++;
break;
}

}
if (!flag)
4000
flagn[i] = 1;
}*/

//to judge whether it's agree the condition
//not all trust
/*for (int i = 1; i <= N; i++)
{
if (flagn[i]) {
if (!flagn[i + 2])
count++;
}
}*/
printf("%d", count);
return 0;
}


结果参考:

1-4 : 0

20:4

100:8

1000:35

10000:205

100000:1224

这道题做的时候以为可以像之前那样直接通过标记解决问题,但似乎数值太大了,后来另外用一个数组进行存储,同时在素数判断的时候,通过sqrt(N)减少时间,再通过数组进行判断才解决了问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: