当前位置: 代码迷 >> 综合 >> PAT (Basic Level) Practice || 1007 素数对猜想 (20 分)
  详细解决方案

PAT (Basic Level) Practice || 1007 素数对猜想 (20 分)

热度:27   发布时间:2023-11-29 11:40:18.0

题目描述:

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

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

输入格式:

输入在一行给出正整数N

输出格式:

在一行中输出不超过N的满足猜想的素数对的个数。

输入样例:

20

输出样例:

4

解题思路:

一眼看过去,emm……水题。直接把该数之前的所有素数存在一个数组中,检测相邻两数的差,差为2的便给num加一,遍历一次输出num就好了。

//运行超时的答案
#include<stdio.h>
#include<math.h>int prime(int p);int main()
{int i, n, x=0, num=0;scanf("%d", &n);int a[n];for(i=0;i<=n;i++)if(prime(i) == 1)a[x] = i, x++;for(i=0;i<x-1;i++)if(a[i+1]-a[i] == 2)num++;printf("%d\n", num);return 0;
}int prime(int p)
{int i;if(p <= 1)return 0;else if(p == 2)return 1;else{for(i=2;i<p;i++)if(p%i == 0)return 0;return 1;}
}

结果嘛,显而易见,最后一个测试点超时。

然后就开始查资料,发现判断素数只需要判断到这个数的开方即可。然后就是优化代码。

下面是AC后的代码:

#include<stdio.h>
#include<math.h>int prime(int p);int main()
{int i, n, x=0, num=0;scanf("%d", &n);int a[n];for(i=0;i<=n;i++)if(prime(i) == 1)a[x] = i, x++;for(i=0;i<x-1;i++)if(a[i+1]-a[i] == 2)num++;printf("%d\n", num);return 0;
}int prime(int p)
{int i;if(p <= 1)return 0;else if(p == 2)return 1;else{for(i=2;i<=sqrt(p);i++)if(p%i == 0)return 0;return 1;}
}

 

  相关解决方案