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语言不迷路。
需要分析可以到微信公众号发送问题或者在评论区留言,有问题必抽时间思考回答
**
量子云基地