问题描述:
让我们定义为:,其中是第i个素数。显然有d1=1,且对于n>1有是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。
现给定任意正整数 N (<10^5),请计算不超过
N
的满足猜想的素数对的个数。
输入格式:
在一行输入正整数N。
输出格式:
输出N以内的所有素数,两个素数之间用两个空格隔开。
在随后一行中输出不超过
N
的满足猜想的素数对的个数。
输入样例:
请输入数字N(N>=2):
20
输出样例:
即20以内的所有素数为:
2 3 5 7 11 13 17 19
其中素数对有 4 个
运行截图:
程序代码:
代码中 bool prime() 函数判断一个数是否为质数的原理:
如果一个数N不是素数,那么必有N=a×b(a、b都不等于1),且a、b两个数中必有一个大于或等于根号N,
一个小于或等于根号N。因此,只要小于或等于根号N的数(1除外)不能整除N,那么N就一定是素数。
#include<iostream>
using namespace std;/*定义一个bool型的函数prime(),用来判断一个数字是否为质数*/
bool prime(int x) {int y = sqrt(x);for (int i = 2; i <= y; i++) {if (x % i == 0) {return false;}}return true;
}int main() {int n, sum = 0, len = 0;//sum表示素数对的个数,len表示数组arr[]的长度cout << "请输入数字N(N>=2):" << endl;cin >> n;int arr[100000];//定义一个数组,用来存放n以内的所有质数/*从2开始遍历到N,逐个判断*/for (int j = 2; j <= n; j++) {if (prime(j)) {//调用prime()函数,判断j是否为质数,如果j是质数,将j存入数组arr[len] = j;len++;}}/*输出N以内的所有素数*/cout << "\n即" << n << "以内的所有素数为:" << endl;for (int i = 0; i < len; i++) {cout << arr[i] << " ";}cout <<endl;/*统计其中素数对的个数*/for (int i = 1; i < len; i++) {if (arr[i] - arr[i - 1] == 2) {sum++;}}/*输出素数对的个数*/cout << "其中素数对有 " << sum << " 个" << endl;return 0;
}