分解一个整数的素因子是编程中很简单的问题,下面提供两种思路,并用代码实现,重点比较代码的略微不同,希望能从中能够有所感悟
《1》 以12为例,24=2*12,12=2*6,6=2*3,这种思路是把n分解成两个因子,找出第一个最小因子,然后对剩下的数再找第一个最小因子,直到最后一个数是素数
代码实现:
#include <stdio.h>
#include <conio.h>
int main()
{
int n;
printf("please input a number:");
scanf("%d",&n);
printf("%d=1",n);
while(n!=1)
{
//firstPrime表示第一个素因子
for(int firstPrime=2;firstPrime<=n;firstPrime++)
{
//整数分成两个数的积,只取第一个最小素数,当n是素数时firstPrime=n
if(n%firstPrime==0)
{
printf("*%d",firstPrime);
n = n/firstPrime;
break; //第一个素因子输出即退出
}
}
}
getch();
return 0;
}
关键在于一直输出第一个素因子,最后只剩下素数时,它的第一个素因子就是它自己,再经过n=n / firstPrime,n就是1了,于是n!=1可作为退出循环的条件
《2》第二种思路是从2、3、4、5中一个一个去考察,如果因子有2的话,就一股脑把所有的2给输出来,然后再把所有的3输出来;还要考虑到,当所有的2被输出时,那么4、6、8就不会再被考虑了
代码实现:
#include <stdio.h>
#include <conio.h>
int main()
{
int n;
printf("请输入正整数:");
scanf("%d",&n);
printf("%d=1",n);
//先分离出所有的2,再分离出所有的3,依次进行
for(int i=2;i<=n;i++)
{
//循环达到彻底分离i的目的
while(n!=1)
{
if(n%i==0)
{
printf("*%d",i);
n = n/i;
}
else
break; //break的退出代表i已经全部分离
}
}
getch();
return 0;
}
这两种方式都用了两层循环,但是循环的嵌套顺序却不一样,体现的算法思想也自然不一样。
个人感觉第一种算法思想较为简单,原因很简单,第一种方法可以很直观的画出一个树形图,形似一个一步一步分解的二叉树,而每一个分解步骤都旨在找到左树枝代表的最小因子,所以可以把一个问题分解成找最小因子的问题,然后重复地去找即可,经过有限步之后,必然全部找出。
简单的算法思想有助于理解程序设计的本质。