质因数分解函数

编写函数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

发布了43 篇原创文章 · 获赞 23 · 访问量 5308

猜你喜欢

转载自blog.csdn.net/weixin_43442778/article/details/103793106