PAT乙级1007和指针

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值