第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是素数)