编写函数void func(unsinged int n),实现计算并输出一个正整数的质因数分解式。例如:n为90时,输出90=2*3*3*5。
①是素数就输出:
可能直接想着先要做个判断了,如果是素数判断结束,输出这个素数。如果不是,在进入下面的分解的步骤吧。
但是,有没有人想过素数的定义是什么?素数是一类只能被1或自身整除的数字对吧?如果去掉之前的这个判断,直接在接下来的分解步骤中去判断会怎样?
假如输入了“11”,“11”是个素数,只能被1和11整除。那么,设置除数从2开始,是不是从2到10为止都没法整除呢?等到了11,11除以11刚好是1,这时候输出11。是不是和上面的判断的结果一样呢?
②、输出质因数的分解式,除数是素数:
在这里可能会有人会疑惑了,如果只用素数整除,是不是应该写个函数去输出素数呢?从2开始,3、5、7、11这样的去循环输出着素数。假如除不尽2就换3,以此类推。
如果真的这样去想,源码不仅会写的特别繁杂不说,还要经过反反复复的调试。那么,有没有更简单的方法呢?
假如,输入一个数字24。24可以分解成3X8或者4X6对吧?但是我们按照①的想法走,第一个除数是2,那么3X8就直接出局了。可能有人会想,24除2得到12,2加1是3,12除以3是4,3再加1是4,除数中有非素数了,不对啊!!!!!!况且4还能拆分成两个2啊?!
那么,可以在除以2的时候做个判断啊,如果第一次除后的所得的商能继续被2所整除,那除数就先不要加1就好了嘛!直到除不尽了,换下一个,以此类推。
如果到4了呢?岂不是要出现非素数吗?
不可能的,依照上面的想法,除数在没法整除后依次累加,得到的所有的除数只可能是素数。因为4在到达它之前,已经拆分成两个2了。如果是18,第一次得9,也就不会出现9,因为在9的前面已经有了3X3搞定了!!!
因此,这道题无非就是考一个累除法的编写。
#include <stdio.h>
#include <string.h>
void func(unsigned int n)
{
int i=2,flag=0;
while(n>=2) {
if(n%i==0) {
if(flag==1)
printf("*");
printf("%d",i);
n=n/i;
flag=1;
} else {
i++;
}
}
printf("\n");
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
func(n);
return 0;
}
思路参考:https://blog.csdn.net/Issac_X10A/article/details/81773427
来源:CSDN
作者:The-Fighting-boy
链接:https://blog.csdn.net/weixin_43442778/article/details/103793106