/*coded by indere 2017/06/18*/
//让我们定义 dn 为:dn = pn + 1 - pn,其中 pi 是第i个素数。显然有 d1 = 1 且对于n > 1有 dn 是偶数。
//“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。
//现给定任意正整数N(< 10^5),请计算不超过N的满足猜想的素数对的个数。
//
//输入格式:每个测试输入包含1个测试用例,给出正整数N。
//输出格式:每个测试用例的输出占一行,不超过N的满足猜想的素数对的个数。
//输入样例:
//20
//输出样例:
//4
//分析:
//判断一个数是否为素数,从大到小一次除以比它的平方根小的素数,如果都不能整数,则为素数
//在个程序里面我创了一个链表来存储所有的素数。
#include<stdio.h>
#include<stdlib.h>
typedef struct Prime { /*素数链表节点*/
int num; /*数字*/
struct Prime *next; /*下一个节点*/
}PrimeNum;
void getPrime(PrimeNum *head, int num); /*根据输入的数据,创建素数链表*/
int judgePrime(PrimeNum *head, int num); /*判断数num是否为素数*/
void printPrimenum(PrimeNum *head); /*输出满足条件的素数对个数*/
int main() {
int end;
scanf("%d", &end);
PrimeNum *head = (PrimeNum *)malloc(sizeof(PrimeNum));
head->num = 0;
head->next = NULL;
getPrime(head,end);
printPrimenum(head);
return 0;
}
void getPrime(PrimeNum * head, int num) {
if (num <= 1)
return;
head->num = 2;
head->next = NULL;
PrimeNum *p = head;
for (int i = 3; i < num + 1; i++) {
if (judgePrime(head, i)) { /*是素数,则加入链表*/
PrimeNum *preme = (PrimeNum *)malloc(sizeof(PrimeNum));
preme->num = i;
preme->next = NULL;
p->next = preme;
p = preme;
}
}
p = NULL;
}
int judgePrime(PrimeNum *head, int num) {
PrimeNum *p = head;
while (p) {
if ((p->num * p->num <= num) && (num % (p->num)) == 0) {
return 0;
}else if((p->num * p->num > num)){
break;
}
p = p->next;
}
p = NULL;
return 1;
}
void printPrimenum(PrimeNum *head) {
int sum = 0;
int temp = head->num;
PrimeNum *p = head->next;
while (p) {
if (p->num - temp == 2)
sum++;
temp = p->num;
p = p->next;
}
printf("%d\n", sum);
p = NULL;
}
1007. 素数对猜想 (20)
最新推荐文章于 2021-01-25 09:39:11 发布