计算两个数的最大公约数和最小公倍数(4种算法)
计算三个数的最大公约数和最小公倍数
算法描述:
计算两个数的最大公约数用到了四种算法:
首先将两数比较,a为大数,b为小数
(1)辗转相除法: a对b求模,若能整除,则b为最大公约数; 若不能,则将b赋值给a, 将a%b赋值给b,递归调用自身
(2)穷举法:从b-1开始递减依次对a和b整除, 若都能整除则为最大公约数
(3)相减法:a-b的差值和较小数b相比,如果大于,则用差值和b继续相减;若小于,则用b减差值;当两数相等时得到最大公约数. 和辗转相除法类似, 都用到了递归函数,此方法适合数值较小的运算
(4)短除法: 这个方法就是我们数学中求最大公约数的方法, 对两个数分别分解质因数, 当因数不同时,前面所有相同的质因数之积即为最大公约数
最小公倍数则用两数乘积除以最大公约数得到;
三个数同理先求出两个数的最大公约数再和第三个数求出三数最大公约数;
c++源代码
#include<iostream>
using namespace std;
//方法1:辗转相除法
int gcd(int a,int b){
if(a%b==0)
return b;
else
gcd(b,a%b);
}
//方法2:穷举法
int f(int a,int b){
for(int i=b;i>0;i--){
if(a%i==0&&b%i==0)
return i;
}
}
//方法3: 相减法
int sub(int a,int b){
if(a==b)
return a;
else if(a-b>b)
sub(a-b,b);
else
sub(b,a-b);
}
//方法4:短除法
int div(int a,int b){
int f=1;
for(int i=2;i<=a&&i<=b;i++){
while(a%i==0&&b%i==0){
f*=i;
a/=i;
b/=i;
}
}
return f;
}
//交换函数
void swap(int a,int b){
if(a<b){//把大数给a,小数给b
int t=a;
a=b;
b=t;
}
}
int main(){
int a,b,c,choice;
cout<<""<<endl;
cout<<"------请选择对两个数或三个数进行操作-------"<<endl;
cout<<" 2.两个数 "<<endl;
cout<<" 3.三个数 "<<endl;
cout<<" 请输入:";
while(cin>>choice){
switch(choice){
case 2:{
cout<<" 请输入两个数: ";
cin>>a>>b;
int max=a>b?a:b;
int min=a<b?a:b;
cout<<" 最大公约数: "<<endl;
cout<<" 1.辗转相除法: "<<gcd(max,min)<<endl;
cout<<" 2.穷举法: "<<f(max,min)<<endl;
cout<<" 3.辗转相减法: "<<sub(max,min)<<endl;
cout<<" 4.短除法: "<<div(max,min)<<endl;
cout<<" 最小公倍数: "<<a*b/gcd(max,min)<<endl<<endl; //用两数乘积除以最大公约数得到最小公倍数
break;
}
case 3:{
cout<<" 请输入三个数: ";
cin>>a>>b>>c;
swap(a,b);
int q=gcd(a,b);
swap(q,c);
cout<<" 最大公约数:"<<gcd(q,c)<<endl;
cout<<" 最小公倍数:"<<a*b*c/(gcd(q,c)*gcd(q,c))<<endl;//三数乘积除以最大公约数二次方得最小公倍数
break;
}
default:
cout<<" 输入错误,请重新输入: "<<endl;
}
cout<<" ";
}
return 0;
}
程序流程图: