比较两种不同思路分解素因子

分解一个整数的素因子是编程中很简单的问题,下面提供两种思路,并用代码实现,重点比较代码的略微不同,希望能从中能够有所感悟


《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;
}

                这两种方式都用了两层循环,但是循环的嵌套顺序却不一样,体现的算法思想也自然不一样。

个人感觉第一种算法思想较为简单,原因很简单,第一种方法可以很直观的画出一个树形图,形似一个一步一步分解的二叉树,而每一个分解步骤都旨在找到左树枝代表的最小因子,所以可以把一个问题分解成找最小因子的问题,然后重复地去找即可,经过有限步之后,必然全部找出。

简单的算法思想有助于理解程序设计的本质。










评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值