c语言的编程题,帮忙给解答一下吧!

.编程题
请编写函数fun,函数的功能是:将大于形参m且紧靠m的k个素数存入xx所指的数组中。例如,若输入17、5,则应输出:19、23、29、31、37。
注意:部分源程序已给出。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。

注意:不要对main()函数进行改动。
源程序存放在考生文件夹下的pro.C中。
#include <stdio.h>
void fun(int m,int k,int xx[])
{
int j,n=0;
while(n<k)
{
m++;
for(j=2;j<m;j++)
if(m%j==0) break;
if(j>=m) xx[n++]=m;
}
}
void main()
{
FILE *out;
int m,n,zz[1000] ;
printf( "Please enter two integers:");
scanf("%d%d",&m,&n);
fun(m,n,zz);
out=fopen("out.dat","w");
out=fopen("out.dat","at");
for(m=0;m<n;m++)
{
printf("%d ",zz[m]);
printf(" ");
fprintf(out,"%d",zz[m]);
fputs(" ",out);
}
fclose(out);
}
麻烦给形参里面的程序每句话都解释一下,不是太懂啊!

第1个回答  2012-02-24
void fun(int m,int k,int xx[])
{
int j,n=0; //定义辅助变量,n为素数的个数,从0开始
while(n<k) //控制素数的数量,只允许选择k个
{
m++; // 从m+1开始不断判断是否为素数,此时m=m+1
for(j=2;j<m;j++) 从2到m之间,判断时候有一个整数是m的约数
if(m%j==0) break; 如果有约数,则这个数不为素数,退出循环
if(j>=m) xx[n++]=m; // 进一步判断是否为素数,如果最后j>=m,则这个
// 数为素数,并将这个数存到xx[n]里。
}
}
满意请采纳!
第2个回答  2012-02-24
#include <stdio.h>
void fun(int m,int k,int xx[])
{
int j,n=0;
while(n<k)//n代表已经找到多少个大于M的素数了
{
m++;//M加1,待判断的数字
for(j=2;j<m;j++)//从2到M-1判断是不是约数,用素数的定义来判断
if(m%j==0) break;//如果能整除,说明有约数,跳出
if(j>=m) xx[n++]=m;//如果j>=m说明上面都除不掉,是素数,加上,然N自加1
}
}
void main()
{
FILE *out;
int m,n,zz[1000] ;
printf( "Please enter two integers:");
scanf("%d%d",&m,&n);
fun(m,n,zz);
out=fopen("out.dat","w");
out=fopen("out.dat","at");
for(m=0;m<n;m++)
{
printf("%d ",zz[m]);
printf(" ");
fprintf(out,"%d",zz[m]);
fputs(" ",out);
}
fclose(out);
}
第3个回答  2012-02-24
void fun(int m,int k,int xx[]) //例如、当m=17,k=5 意思是将大于且最接近
//17的5个素数存入数组xx[]
{
if(m<0)
{
printf("Invalid m ! \n");
return ;
}
int j,n=0;
while(n<k)
{
m++;
for(j=2;j<m;j++)
if(m%j==0) break;
if(j>=m) xx[n++]=m;
}
}
第4个回答  2012-02-27
这个程序写得有问题,刚看到开头的
for(j=2;j<m;j++)
if(m%j==0) break;
if(j>=m) xx[n++]=m;
这里面就有2个错,一个逻辑错误,一个概念不清。要不要我帮你重写一个?追问

可以啊,如果你有时间的话!

追答

#include
#include

int a;//将选定的质数声明为全局变量,这样可以使函数改变其值

static int IsPrime(int);//此函数用来验证选定的数是否为质数
static void Prompt();//这是提示
static int Calculate(int);//此函数用来计算选定质数的接下来的五个质数
static void ListResults(int);//此函数用来输出计算出来的5个质数

main()
{
int prime[5]={0,0,0,0,0};//初始化数组中的每个元素

Prompt();
Calculate(prime[5]);
ListResults(prime[5]);
}

int IsPrime(int n)
{
int i,limit;

if(n<=1) return 0;
if(n==2) return 1;
if(n%2==0) return 0;
limit=sqrt(n)+1;
for(i=3;i<=limit;i+=2)
{
if(n%i==0) return 0;
}
return 1;
}

void Prompt()
{
while(1)
{
printf("请输入一个质数: ");
scanf("%d",&a);
if(IsPrime(a)) break;
printf("请重新输入!");
}
}

int Calculate(int num[5])
{
int i, n=0;

for(i=a+1;n<=5;i++)
if(IsPrime(i))
{
num[n]=i;
n++;
}

return num[5];
}

void ListResults(int num[])
{
int i;

printf("接下来的5个质数为: ");
for(i=0;i<5;i++)
{
printf("%5d",num[i]);
}
}

另外补充一下,上述验证质数的算法是一个高效的算法,你应该能看懂,如果你只知道质数的定义(除了1和本身,不能被其他正整数整除),那么可以使用下面的验证方法来替代,不过效率就十分低下:
int IsPrime(int n)
{
int divisors, i;

divisors=0;
for(i=1;i<=n;i++)
{ if(n%i==0) divisors++;}

return (divisors==2);
}

上述代码一定正确,复制粘贴然后运行即可,记得给分哦!

本回答被提问者采纳
相似回答