1007 素数对猜想 (20 分)
“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。现给定任意正整数N(<10^5 ),请计算不超过N的满足猜想的素数对的个数。
- 我想的是先把N里面的素数先算出来,用一个链表存下来,然后再依次拿两个出来比较计算一下。结果在写链表的时候出了一点问题,发现对指针理解的好像不是很清楚。
这是存素数的结构体
typedef struct primeNum
{
unsigned int n;
struct primeNum *next;
}primeNum;
用无头结点的链表,main函数里定义了一个指针h。下面是一开始定义的insert函数。
primeNum *h = NULL;
void insertLinkList(primeNum *h,int n)
{
primeNum *p = (primeNum *)malloc(sizeof(primeNum));
p->n = n;
p->next = NULL;
primeNum *q = h;
if(h)
{
while(q->next)
q = q->next;
q->next = p;
}
else
{
h = p;
}
}
函数的意思是:h一开始是NULL,所以第一个素数使用malloc分配空间之后,直接让h指向这个空间的首地址(h = p;)。但是函数结束后,实参h的值还是NULL。这里没有达到我料想的指针做形参传进来,修改之后,就可以传出函数。因为一般定义指针将函数里的值传回实参里面,是要将这个实参的地址传进去,我这个primeNum *h 只是和实参h一样的类型,就像定义实参int a,然后定义形参int a,只是定义了一个同类型的形参,压根就没有把h的地址传进去,而是把h的值传进去了而已。要想真正达到效果就得定义primeNum **h,然后传参的时候用&h取地址,这样才对?。真菜,要被自己蠢死了。
所以改正的话就要写primeNum **h,或者将函数改成primeNum *类型,然后把h return出来。
这里两种都写上了。
primeNum * insertLinkList(primeNum **h,int n)
{
primeNum *p = (primeNum *)malloc(sizeof(primeNum));
p->n = n;
p->next = NULL;
primeNum *q = *h;
if(*h)
{
while(q->next)
q = q->next;
q->next = p;
}
else
{
*h = p;
}
return *h;
}
1007的完整代码。
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
typedef struct primeNum
{
unsigned int n;
struct primeNum *next;
}primeNum;
int isPrimeNum(unsigned int n);
primeNum *insertLinkList(primeNum **h,int n);
int main()
{
unsigned int N;
scanf("%d",&N);
int result = 0;
primeNum *h = NULL;
int i;
int m = sqrt(N);
int count = 0;
for(i = 2; i <= N; i ++)
{
if(isPrimeNum(i))
insertLinkList(&h,i);
//h = insertLinkList(&h,i);//这样用也行,那样就不用定义primeNum **h了
}
primeNum *p;
primeNum *pre = h;
while(pre && pre->next)
{
p = pre->next;
if((p->n - pre->n) == 2)
count++;
pre = pre->next;
}
printf("%d",count);
return 0;
}
int isPrimeNum(unsigned int n)
{
int m = sqrt(n);
int i;
for(i = 2; i <= m; i++)
{
if(n % i == 0)
return 0;
}
return 1;
}
primeNum * insertLinkList(primeNum **h,int n)
{
primeNum *p = (primeNum *)malloc(sizeof(primeNum));
p->n = n;
p->next = NULL;
primeNum *q = *h;
if(*h)
{
while(q->next)
q = q->next;
q->next = p;
}
else
*h = p;
return *h;
}