自测-2 素数对猜想 (20 分)
让我们定义dn为:dn=pn+1−pn,其中pi是第i个素数。显然有d1=1,且对于n>1有dn是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。
现给定任意正整数N(<105),请计算不超过N的满足猜想的素数对的个数。
输入格式:
输入在一行给出正整数N。
输出格式:
在一行中输出不超过N的满足猜想的素数对的个数。
输入样例:
20 |
---|
输出样例:
4 |
---|
思路:
- 素数判定、存储
- 素数对判定
代码:
/*输入在一行给出正整数N,在一行中输出不超过N的满足猜想的素数对的个数。
**确定素数->筛选素数对。*/
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
struct Prime{
int num;
struct Prime* next;
};
int main() {
struct Prime* creat(int i);
int n, m=0, t=0;
struct Prime *head=NULL, *p1, *p2=NULL, *s;
scanf_s("%d", &n);
/*判断素数*/
int i, j;
if (n>1 && n<100000) {
for (i = 2; i <= n; i++) {
for (j = (int)sqrt(i); j >= 1; j--) {
if (i % j == 0) {
break;
}
}
if (j==1) {
m++;//计数
if (m==1) {
head= p2= creat(i);//存放素数,记录链表头指针
}else {
p1 = creat(i);//存放素数,记录结点指针
p2->next = p1;//当前结点向前链接
p2 = p1;//p2向后移动,指向新结点
}
}
}
}
/*筛选素数对*/
s = head;
for (int k = 1; k < m; k++) {
if (s->next->num - s->num == 2) {
t++;
}
s = s->next;
}
printf("%d\n", t);
return 0;
}
/*创建新结点,存放新素数*/
struct Prime* creat(int i) {
struct Prime *p;
p = (struct Prime*)malloc(sizeof(struct Prime));
p->num = i;
p->next = NULL;
return p;
}