可能刚看到这个题目,会觉得很麻烦。
既要用到函数,还要用到素数的判断对吧。
统统都不用!
慢慢来分析一下这个题:
①、在2~100000的范围内输入一个数,是素数就输出:
可能直接想着先要做个判断了,如果是素数判断结束,输出这个素数。如果不是,在进入下面的分解的步骤吧。
但是,有没有人想过素数的定义是什么?素数是一类只能被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>
int main()
{
int n;
int x;
scanf("%d", &n);//读入
printf("%d=", n);//先输出式子的开头
for (x=2;2<=n&&n<=100000; )
{
if(n % x==0)
{
printf("%d", x);
n = n / x;
if(n != 1)
{
printf("x");
}
}
else
{
x++;
}
}
return 0;
}