论C语言习题,如何输出一个数的质因数分解式?

可能刚看到这个题目,会觉得很麻烦。

既要用到函数,还要用到素数的判断对吧。

统统都不用!

慢慢来分析一下这个题:

①、在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;
}

猜你喜欢

转载自blog.csdn.net/Issac_X10A/article/details/81773427