编写程序求出两个或三个数的最大公约数和最小公倍数
要求:
1.用三种以上算法解决两个正整数最大公约数问题。
2. 求3个正整数的最大公约数和最小公倍数。
思路分析:
三种求最大公约数的方法分别是:辗转相除法;相减法;穷举法。
求三个整数的最大公约数和最小公倍数编码时,通过if条件语句找出a,b,c三个数中最小的数,再通过穷举法得出三个数的最小公倍数与最大公约数。
源代码:
#include<iostream>
using namespace std;
class My{
public:
int a;//三个正整数
int b;
int c;
int temp;
int t;
int x;//选择
My();//构造函数
int Max1(int x,int y);//辗转相除法
int Max2(int x,int y);//相减法
int Max3(int x,int y);//穷举法
int Max_Min(int x,int y,int z);//求三个数的最大公约数和最小公倍数
};
My::My()//构造函数初始化
{
a=0;
b=0;
c=0;
temp=0;
t=0;
x=0;//选择
}
int My::Max1(int x,int y)//辗转相除法
{
int a1=0;
int b1=0;
//int temp;
if(a<b)//判断a,b大小,若b>a则交换
{
temp=a;
a=b;
b=temp;
}
a1=a;
b1=b;
while(a%b!=0)//b不是a的质因数
{
temp=a%b;//大数除以小数取余,直到余数为零,终止循环
a=b;
b=temp;
}
cout<<"辗转相除法求得的两个数的最大公约数为:"<<b<<endl;
cout<<"最小公倍数为:"<<a1*b1/b<<endl;
return 0;
}
int My::Max2(int x,int y)//相减法
{
int a1=0;
int b1=0;
/*(1)如果a>b,a=a-b;(2)如果a<b,b=b-a;(3)如果a=b,a或b就为这两个整数的最大公约数
(4)如果a!=b,则再执行(1)或(2)*/
/* a, b不相等,大数减小数,直到相等为止。*/
a1=a;
b1=b;
while ( a!=b)
{
if (a>b)
a=a-b;
else
b=b-a;
}
cout<<"相减法求得的两个数的最大公约数为:"<<b<<endl;
cout<<"最小公倍数为:"<<a1*b1/b<<endl;
return b;
}
int My::Max3(int x,int y)//穷举法
{
int a1=0;
int b1=0;
if(a<b)
{
temp=a;
a=b;
b=temp;
}
a1=a;
b1=b;
/*余数都为0时结束循环*/
for(temp=b;a%temp||b%temp;temp--);//
cout<<"穷举法求得的两个数的最大公约数为:"<<temp<<endl;
cout<<"最小公倍数为:"<<a1*b1/temp<<endl;
return 0;
}
/*三个正整数求最大公约数与最小公倍数*/
int My::Max_Min(int x,int y,int z)
{
int i=0;
temp=a;
//找出三个数中最小的数
if(temp>b)
{
temp=b;
}
if(temp>c)
{
temp=c;
}
//
//for(int i=0;i<=temp;i++)
//{
for(i=temp;a%i||b%i||c%i;i--);//穷举法直到余数为0停止循环
//t=i; //break;
//}
cout<<"三个数的最大公约数为:"<<i<<endl;
cout<<"三个数的最小公倍数为:"<<a*b*c/i<<endl;
return temp;
}
int main()
{
My m;//定义类对象m
//int x=0;
//int a=0;
//int b=0;
cout<<"请选择算法"<<endl;
cout<<"1.辗转相除法,2.相减法3.穷举法,4.求三个数"<<endl;
cin>>m.x;//将输入的值传给x选择计算方法
switch(m.x)
{
//输入为1,选择辗转相除法
case 1:
cout<<"请输入需要计算的两个数"<<endl;
cin>>m.a;
cin>>m.b;
m.Max1(m.a,m.b);
break;
//输入为2,选择相减法
case 2:
cout<<"请输入需要计算的两个数"<<endl;
cin>>m.a;
cin>>m.b;
m.Max2(m.a,m.b);
break;
//输入为3,选择穷举法
case 3:
cout<<"请输入需要计算的两个数"<<endl;
cin>>m.a;
cin>>m.b;
m.Max3(m.a,m.b);
break;
//输入为4,计算三个数
case 4:
cout<<"请输入需要计算的三个数"<<endl;
cin>>m.a;
cin>>m.b;
cin>>m.c;
m.Max_Min(m.a,m.b,m.c);
break;
}
return 0;
}
辗转相除法的算法思想:
两个整数的最大公约数等于其中较小的数和两数的相除余数的最大公约数,如果用gcd(a,b)来表示a和b的最大公约数,那么根据辗转相除法的原理,gcd(a,b)=gcd(b,a mod (b)),其中mod()表示模运算,并且不妨让a>b,这样方便于模运算
a%b得余数c
若c=0,则b即为两数的最大公约数
若c≠0,则a=b,b=c,再回去执行1
相减法的算法思想:
辗转相减法,即尼考曼彻斯法,
如果a>b,a=a-b;
如果a<b,b=b-a;
如果a=b,a或b就为这两个整数的最大公约数
如果a!=b,则再执行(1)或(2)
穷举法的算法思想:
i= a(或b)
若a,b能同时被i整除,则i即为最大公约数,结束
i--,再回去执行2*