问答题
请编写函数fun,函数的功能是:将大于形参m且紧靠m的k个素数存入xx所指的数组中。例如,若输入17,5,则应输出:19,23,29,31,37。
注意:部分源程序在文件PROG1. C文件中。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
#include <stdio. h>
void fun(int m, int k, int xx[ ])
{
}
Main( )
{
int m, n, zz[1000], void NONO( );
printf("/nplease enter two integers:");
scanf("%d%d", &m, &n);
fun(m, n, zz);
for(m=0; m<n; m++)
printf("%d", zz[m]);
printf("/n");
NONO( );
}
Void NONO( )
{/* 本函数用于打开文件,输入测试数据,调用fun函数,输出数据,关闭文件。*/
int m, n, zz[1000], i;
FILE *rf, *wf;
rf=fopen("in. dat", "r");
wf=fopen("out. dat", "w");
for(i=0, i<10; i++) {
fscanf(rf, "%d%d", &m, &n);
fun(m, n, zz);
for(m=0; m<N; m++) fprintf
(wf, "%d", zz [m]);
fprint(wf, "/n");
}
fclose(rf);
fclose(wf);
}
【正确答案】
【答案解析】int r=0, temp, p, sign=1;
for(temp=m+1; temp<m*m; temp++)
//从temp开始循环,判断紧靠temp的整数
{
for(p=2; p<temp; p++)
{
if(temp%p!=0) //判断temp是否为素数
siqn=1; //若是素数,标志设为1
else
{
sign=0; //若不是素数,标志设为0
break;
}
}
if(sign==1&&p>=temp)
{
if(k>=0) //判断已有的素数个数是否已经满足sum个
{
xx[r++]=temp; //将素数temp存入数组select
k--; //将题目中要求的素数个数减1
}
else
break;
}
}
[解析] (1)该程序功能是取大于整数m且紧靠m的k个素数。其中,素数是指只能被1和自身除尽的正整数(>1),所以判别n是否为素数,只要用2~n-1这些数逐个去除n,判断余数是否为0即可。只要有一次余数为0,n就不是素数,否则n为素数。
(2)从己给部分源程序的main主函数开始入手,核心函数“fun(m, n, zz);”中的参数由题目可知,zz存放素数,n为要求的素数个数。
进入fun函数,根据前面的分析:
首先,定义、初始化变量sign,作为素数的标志;定义r,初始化为存储素数数组的起始位。
然后,每判断一次temp中的值是否为素数后,使temp的值增1,再次对temp中新的值进行判断其是否为素数,不断循环此过程,直到m的值等于指定的个数,即函数中的k个数。
[考点] 循环嵌套、一维数组。