题目概述:
让我们定义 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)
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)减少时间,再通过数组进行判断才解决了问题。