求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);
}
运行结果:
此算法比第三种算法更加通用,可以方便地求解更多数地最小公倍数。