题目:
让我们定义dn为:dn=pn+1−pn,其中pi是第i个素数。显然有d1=1,且对于n>1有dn是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。
现给定任意正整数N(<105),请计算不超过N的满足猜想的素数对的个数。
输入格式:
输入在一行给出正整数N。
输出格式:
在一行中输出不超过N的满足猜想的素数对的个数。
输入样例:
20
输出样例:
4
C语言版
方法一:一边找出素数,一边比较
#include<stdio.h>
#include <math.h>
#define MAX 100000
int main(void) {
int N; //输入的正整数N
int k, n_TwinPrimes = 0;
int prime = 0;
scanf("%d", &N);
if (N > 0 && N < MAX) {
for (int i = N; i >= 2; i--) {
k = 1;
for (int j = 2; j <= (int)sqrt(i); j++) {
if (i % j == 0) {
k = 0;
break;
}
}
if (k == 1) {
if (prime > 1 && prime - i == 2)
n_TwinPrimes++;
prime = i;
}
}
printf("%d\n", n_TwinPrimes);
}
return 0;
}
方法二:先找出全部素数依次放进数组中,再进行比较
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main(void) {
int n; //输入的正整数n
int k, p = 0, n_twinprimes = 0;
scanf("%d", &n);
int *a = (int *)malloc(sizeof(int) * n);
/*将n以内的正整数依次放入数组a里面,然后输出*/
if (n > 0 && n < 100000) {
for (int i = 2; i <= n; i++) {
k = 0;
for (int j = 2; j <= (int)sqrt(i); j++) {
if (i % j == 0) {
k++;
}
}
if (k == 0) {
a[p] = i;
p++;
}
}
for (int i = p - 1; i >= 1; i--) {
if (a[i] - a[i - 1] == 2) {
n_twinprimes++;
}
}
printf("%d\n", n_twinprimes);
}
return 0;
}