这一题哪位兄弟帮我做一下 C语言

来源:百度知道 编辑:UC知道 时间:2024/05/16 09:42:28
运行输入n,输出n的所有质数因子 例如13860,则输出2,2,3,3,5,7,11
#include <stdio.h>
void main()
{ int n,i;
scanf("%d",&n);
/****** 1 ******/
i=1;
while(n>1)
if(n%i==0) {
printf("%d\t",i);
n/=i;
}
else
/******** 2 *******/
n++;
}
/******** N *******/下一行有错需要改正

1:
i=2;//要从2开始找。1也可以整除。
2:
i++;//i要累加。
回答者:就是爱吃红烧肉 - 江湖新秀 四级 4-14 21:26

跟楼上探讨下:
第一个如果是i=2的话那么后面又i=1这句就没意义了,这里如果一定要写什么的话是不是放一个对n是否大于1的异常检测会好些?
还有楼主的代码应该是没帖全,没有质数判断部分。

我跑了下发现在i=1时,一直在执行这部分
if(n%i==0) {
printf("%d\t",i);
n/=i;
}
而这里面没有i累加,也就是个死循环。我有点晕了,这题是不是有毛病?
回答者: 负家子弟 - 总监 八级 4-14 21:46

=============================================================

我帮他回答一下。
他的意思是把i=1这句话去掉。
改成i=2;
如果i=1,产生死循环,我加上注释就容易看出来了。
if(n%i==0) // i=1,所以n%i永远为真,执行大括号内代码。
{
printf("%d\t",i);
n/=i; // n/1=n,n也没有发生变化。
}
所以n永远大于1。会造成死循环。

不用判断i是否是质数。
每找到一个质数因子,就执行一次n/=i。
当i是和数的时候,只执行i++,避免发生i是和数的情况。

1:
i=2;//要从2开始找。1也可以整除。
2:
i++;//i要累加。

谢谢各位点拨,我有点明白了

由于是从2开始所以把所有2的整数倍的合数就去了,
再是3把所有3的整数倍的合数就去了,
到4时就因为这时的n不可能被4整除了所以就过去了,
依此循环直到结束。
这想法实在是高呀,又学一手。