求解关于C语言求非素数问题

这是一个函数调用的问题求所有大于1小于m的非素数存入xx数组中,个数为k返回 主函数我省略了这是调用函数部分
void fun(int m,int *k,int xx[])

int i,j,n=0;
for(i=4;i<m;i++)
{for(j=2;j<i;j++)
if(i%j==)break;
if(j<i)xx[n++]=i;

*k=n;}看不懂循环啊,假如我拿9试验第一个if不成立进入第二个if成立了怎么会输出9的,麻烦帮我理一下思路啊,详细一点,如果可以的话假设一个非素数循环一遍给我看一看过程,谢谢啦
我就说的嘛,原来是答案错了,我绕了半天第二个if有问题,不然一大堆成立的应该是j==i-1吧

void fun(int m,int *k,int xx[])

int i,j,n=0;
for(i=4;i<m;i++)

for(j=2;j<i;j++) if(i%j==0) break;
if(j==i) xx[n++]=i;
}

所谓素数就是不能被不是1和它本身的任何数整除。
这个函数的作用是找出从4到m的所有素数,并添加到数组xx中
第一个外循环是确定一个需要判断的书,比如——6
第二个内循环是从2到5(j<i,i是6)。分别于6取余数,如果有一个余数为0的话,就是能被整除(6除以2,得3余0),不符合素数。就执行break,跳出内循环,继续外循环的下一个数——7
如果内循环从2到6,没有一个可以整除7的,然后把7赋给xx数组,然后n++指向数组的下一位。

注意:你这个函数似乎有点问题呢。怎么没人看得出来?
if(j<i) xx[n++]=i;
这里因改成if(j==i) xx[n++]=i;
因为当j等于i的时候说明j已经从2到i-1都尝试了一遍,而且没有跳出循环,也就是没有整除的,所以是素数。在给数组。
如果是if(j<i) 的话,当i为6,j为2的时候,跳出内循环——for(j=2;j<i;j++) if(i%j==)break;后,仍然会执行 if(j<i) xx[n++]=i;。这时j是2小于i——6.因此判断成立,6给数组。但6不是素数。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-08-13
// 素数:只能被1和它本身整除的数
// 非素数:从2到它本身之间 存在一个 能够整除它自身的数
void fun(int m,int *k,int xx[])
{
int i,j,n=0;
for(i=4;i<m;i++)// i = 9时
{
for(j=2;j<i;j++) //j初始值为2 小于i,于是j 从2开始递增
if(i%j==0) // j=2时, i%j ==1 继续下一次循环; j变为3,此时 9%3==0 ,break跳出内层循环
break;
if(j<i) //此处j<i, 表示 i%j == 0,即 i能够被从2开始到i之间的某个数整除,即i不是素数
xx[n++]=i; //将不是素数的i 存入数组中,从而得到一个非素数(这里没增加一个非素数,
// n就会加1,用来记录有多少个非素数)
}
*k=n; //将非素数的个数记录到k中
}本回答被网友采纳
第2个回答  2012-08-13
void fun(int m,int *k,int xx[])

int i,j,n=0;
for(i=4;i<m;i++)

for(j=2;j<i;j++)
if(i%j==0)break;
if(j<i)xx[n++]=i;

*k=n;

因为2,3,是素数,所以从4开始判断,这个没有问题吧。

你这里是非素数,你这里判断就是说,从2开始,到这个数为止,之间,如果有一个数是他因数,那么它就是一个非素数,因为素数的因子只有1和它本身嘛(for(j=2;j<i;j++)


如果在循环当中,有一个数了,那么那是非素数,既然是非素数,后面就不用看其他因子了,跳出了,就是if(i%j==)break;
这个循环完毕了,好,就看内循环的值走到哪儿了,如果没有走到要判断的数 if(j<i),
就是说,在其中有一个因子(if(i%j==)break;),
就把这个数存入数组xx[n++]=i;其中n就是那个非素数的个数了,来一个n++
到最后,n里面就是存放的个数,*k=n;
第3个回答  2012-08-13
比如拿9做实验 if(9 % 2)不等于0 进入下面的if 因为j < i 所以执行 xx[n++] = i 这个n在这里是计数的 每当有一个数进入xx n就会加一。 下面执行 *k=n 就是吧n赋值给了k所指的地址当中。 由于是地址传值 所以直接更改了主函数里的k所指向的那个变量的值 就是这样。
第4个回答  2012-08-13
int i, j;
int k = 0;
if(m>=4)
for(i = 4;i < m;i ++)
{

for(j=2;j<i;j++)
{
if(i%j=0)
{
xx[k] = i;
k++;
}
}
}

外循环是控制出被除数,即小于m的数;
内循环是控制被除数,从2开始,一直增加,如果i%j=0(即小于m的数能被除了1和它本身外的数整除,也就是非素数)
其实这要求那m的值是大于3的(因为1,2,3是素数)
相似回答