C语言编程题--详细地自定义大小构造一个素数表的方法(不用链表)内存分配以及一个小例子。函数fun的功能是:为一个偶数寻找两个素数,这两个素数之和等于该偶数,并将这两个素数通过形参指针传回主函数。

C语言编程题

程序改错题,下列给定的程序中,函数fun的功能是:为一个偶数寻找两个素数,这两个素数之和等于该偶数

这个题目比较有意思的地方就是可以通过构造一个合适大小的素数表,然后直接通过遍历素数表来找到满足题意的素数。思路清晰,逻辑简单。

首先,我们需要输入一个正确的偶数,这个很简单,直接上代码。如果输入不正确,就继续输入,知道输入了正确的偶数

do{
	printf("please enter an even number: "); //请输入一个偶数
	scanf("%d",&n);
	if (n%2!=0)
		printf("input data error!!\n");//若输入错误则提示错误继续输入
} while (n%2);        //保证输入正确的偶数

然后,我们需要构造一个合适大小的数组来存放素数,根据题意,我们知道,满足题意的两个素数的值不会超过我们输入偶数的值,所以,我们就知道合适的素数的个数肯定是小于我们输入偶数的值。
就如输入的偶数是100,那么素数肯定是从2~100内寻找,那最后找到素数的个数肯定小于100个啊,当然,这里是假设我们不知道某个数学结论的前提下的分析,所以,我们就用这个条件来构造素数表。

这样子的话,就需要一个由用户的输入控制大小的数组,我们就定义一个数组指针,采用malloc函数来分配内存大小

int *Prime_table;//定义一个素数表(数组指针)
Prime_table= (int*)malloc(n*sizeof(int) );//给Prime_table分配内存 

接下来,就是如何构造素数表了,我的方式如下,当然,安全起见,先把数组初始化。素数判断函数是取t从2到需要判断的数的算术平方根,若该数能够被整除就不是素数。如需要判断的数是9,当t=3的时候,9除以3能够整除,则9不是素数。因为素数就是不能被1和本身以外的数整除。

/*********构造合适大小的素数表***********/	
for (i=0; i < n; i++)
	Prime_table[i]=0;	//数组初始化
int P(int x)    //素数判断函数
{
	int t;
	for(t=2;t*t<=x;t++)
		if(!(x%t))
			return 0;
	return 1;  
}
for (j=2; j<n; j++)
	if(P(j))
		Prime_table[k++]=j;//是素数就存入到素数表里
/************素数表构造完毕************/
for (i=0; i<n; i++)//输出素数表以便检查素数是否正确
	if(Prime_table[i])
		printf("%4d",Prime_table[i]);
printf("\n");

好的,准备工作完成了,开始我们的遍历数组找满足条件的素数,思路就是用素数表的素数两两相加,寻找到满足条件的两个数

for ( i = 0; i < n; i++)//开始寻找满足条件的两个素数
	for (j=i; j < n; j++)
		if(Prime_table[i]+Prime_table[j]==n)
			printf("%d+%d=%d\n",Prime_table[i],Prime_table[j],n);

还需要注意用到的头文件

#include<stdio.h>
#include<stdlib.h>
#include<math.h>

🆗 输入偶数100,看看效果,运行示例
在这里插入图片描述
看起来没问题,但是好像数太大了,来个小一点的
在这里插入图片描述
没问题,输入偶数的提示语也还可以,好的,完整代码如下。

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main()
{
	int i,j,k=0,n;
	int *Prime_table;//定义一个素数表(数组指针)

	do{
		printf("please enter an even number: "); //请输入一个偶数
		scanf("%d",&n);
	if (n%2!=0)
		printf("input data error!!\n");
	} while (n%2);        //保证输入正确的偶数

	Prime_table= (int*)malloc(n*sizeof(int) );	//给Prime_table分配内存 

/*********构造合适大小的素数表***********/	
	for (i=0; i < n; i++)
		Prime_table[i]=0;	//数组初始化
	int P(int x)    //素数判断函数
	{
		int t;
		for(t=2;t*t<=x;t++)
			if(!(x%t))
				return 0;
		return 1;  
	}
	for (j=2; j<n; j++)
		if(P(j))
			Prime_table[k++]=j;//是素数就存入到素数表里
/************素数表构造完毕************/

	for (i=0; i<n; i++)//输出素数表以便检查素数是否正确
		if (Prime_table[i])
			printf("%4d",Prime_table[i]);
	printf("\n");


	for ( i = 0; i < n; i++)//开始寻找满足条件的两个素数
		for (j=i; j < n; j++)
		{
			if(Prime_table[i]+Prime_table[j]==n)
			printf("%d+%d=%d\n",Prime_table[i],Prime_table[j],n);
		}			
	return 0;
}

**二级C语言不迷路。

需要分析可以到微信公众号发送问题或者在评论区留言,有问题必抽时间思考回答
**

量子云基地
在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lightHos

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值