求3个数的最小公倍数

求3个数的最小公倍数

1.用蛮力法(枚举法)进行算法设计

蛮力法也称为穷举法或(枚举法)或暴力法,是一种简单的直接解决问题的方法,通常根据问题的描述和所涉及的概念定义,对问题所有可能的结果都进行一次测试,直到找到问题的解或将全部可能的结果都测试一遍为止。

缺点:算法运行效率太低。

优点:基本所有的问题都可以通过蛮力法解决,逻辑简单清晰等。

运行代码:

#include<iostream> 
#include<cmath>
using namespace std;
 
 int MaxData(int a, int b,  int c) {
 	int max = (a > b) ? a : b;
 	return (max > c) ? max : c;
 } 
 
 int main() {
 	int a,b,c,i,k,j=1;
 	cout<<"请输入a,b,c三个数的值: "<<"  ";
	cin>>a>>b>>c;
	int x0 = MaxData(a,b,c);
	while(1) {
		k = x0*j;
		if((k % a == 0) && (k % b == 0) &&(k % c ==0)) break;
		j++;
	}
	cout<<"这三个数的最小公倍数为:"<<"   "<<k<<endl;
	return 0;	 
 }
 

运行结果:
在这里插入图片描述

2.用短除法进行算法设计

用短除法求3个已知数最小公倍数的过程主要是找它们的因数,并且求出这些因数之积即可得出结果。

此算法的复杂度较高,但多数情况下运行效率比蛮力法高。

运行代码:

#include<iostream>
#include<cmath>
using namespace std;

int Max(int a, int b, int c) {
	if(a > b && a > c) return a;
	else if(b > a && b > c) return b;
	else return c;
} 

int main() {
	int a,b,c,i,t = 1;
	cout<<"请输入3个数的值:"<<"  ";
	cin>>a>>b>>c;
	int k = Max(a,b,c); 
	for(i = 2; i <= k; i++) {
		int flag = 1;
		while(flag) {
			flag = 0;
			if(a % i == 0){
				flag = 1;
				a = a / i;
			}
			if(b % i == 0) {
				flag =1;
				b = b /i;
			}
			if(c % i == 0) {
				flag = 1;
				c = c / i;
			}
			if(flag == 1) 
			  t *= i;		
		}
		k = Max(a,b,c);
	}
	cout<<"这三个数的最小公倍数为:  "<<t<<endl; 
}

运行结果:
在这里插入图片描述

3.利用最大公因数求最小公倍数

思路:先求出3个已知的数中任意两个数a,b的最大公因数s,则有最小公倍数d=axb/s;然后同样的步骤求出d与第三个数c的最小公倍数x1,而x1的值为这3个数的最小公倍数。

此算法的运行效率比前两种算法高得多。

运行代码:

#include<iostream>
#include<cmath> 
using namespace std;

//找出任意两个数的最小大公因数(蛮力法)
int Least(int a,int b) {
	int min = a < b ? a : b; 
	int i,k=1;
	for(i = 2; i <= min; i ++){
		if((a % i == 0) && (b % i == 0))
		  k = i;
	} 
	return k;
} 
//或:(辗转相除法)
// int Least(int a,int b) {
// 	int temp = a % b;
// 	while(temp != 0) {
// 		a = b;
// 		b = temp;
// 		temp = a % b;
//	 }
//	 return b;
// } 

int main() {
	int a,b,c,t;
	cout<<"请输入这3个数的值: "<<" ";
	cin>>a>>b>>c; 
	int x0 = a*b/Least(a,b);
	int x1 = c*x0/Least(x0,c);
	cout<<"这3个数的最小公倍数为: "<<x1<<endl; 
}

,运行结果:

在这里插入图片描述

4.利用函数嵌套调用实现问题的解

思路:先设计求三个已知的数中任意两个数的最小公倍数,然后利用函数嵌套调用实现3个数的最小公倍数。

​ 递归设计的思路就是先找出小规模问题的解,然后再递推地解决大规模地问题。还可以直接设计一个求两个数的最小公倍数的函数fs()。这样,再主函数中只需通过函数的嵌套调用,就可完成求解3个数的最小公倍数的过程。

运行代码:

#include<iostream>
using namespace std;
int fs(int a, int b);
int main() {
	int x1,x2,x3,x0;
	cout<<"请输入三个数的值: ";
	cin>>x1>>x2>>x3;
	x0 = fs(fs(x1,x2),x3);
	cout<<x1<<","<<x2<<","<<x3<<"这三个数的最小公倍数为: "<<x0; 
	
} 

//求两个数的最小公倍数
int fs(int a, int b) {
	int a1,b1,c;
	a1 = a;
	b1 = b;
	c = a % b;
	while(c != 0) {
		a = b;
		b = c;
		c = a % b;
	}
	return (a1 * b1 / b);
} 

运行结果:
在这里插入图片描述

此算法比第三种算法更加通用,可以方便地求解更多数地最小公倍数。

  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值