求最大公约数与最小公倍数的方法
题目
本题要求两个给定正整数的最大公约数和最小公倍数。
输入格式:
输入在一行中给出两个正整数M和N(≤1000)。
输出格式:
在一行中顺序输出M和N的最大公约数和最小公倍数,两数字间以1空格分隔。
输入样例:
511 292
输出样例:
73 2044
鸣谢安阳师范学院段晓云老师和软件工程五班李富龙同学补充测试数据!
说明:
先求最大公约(gcd),最小公倍(lcm)=两数乘积/最大公约;
代码(辗转相除法)
//两数,大除小,当余数为零时,gcd就是除数;
有两整数a和b:
① a%b得余数c
② 若c=0,则b即为两数的最大公约数
③ 若c≠0,则a=b,b=c,再回去执行
//我自己的代码
#include<iostream>
using namespace std;
int main(void)
{
double yu,yue,bei;
int a,b;
int c,d;
cin>>a>>b;
c=a;
d=b;
do{
yu=c%d;
c=d;
yue=d;
d=yu;
}while(yu!=0);
a=a/yue;
b=b/yue;
bei=a*b*yue;
cout<<yue<<" "<<bei;
return 0;
}
#include <bits/stdc++.h>
using namespace std;
int main()
{
int m,n,a,b,m1;
cout << "请输入两个正整数: ";
cin >> m >> n;
if(m>n) //大数在前;
{
a=m;
b=n;
}
else
{
a=n;
b=m;
}
do
{
m1=a%b;
a=b;
b=m1;
}while(m1!=0);
cout << "最大公约数=" << a<<endl;
cout << "最小公倍数=" << m*n/a;
return 0;
}
代码(调用gcd函数)
此函数就是辗转相除法的工作原理;
#include <bits/stdc++.h>
using namespace std;
int gcd(int a,int b)//gcd函数求最大公约数
{
if(b==0) return a;
else return gcd(b,a%b);
//return b==0?a:gcd(b,a%b);//另一种大佬的写法。
}
int main()
{
int m,n,aim;
cin>>m>>n;
aim=gcd(m,n);
cout<<"最大公约:"<<aim<<endl;
cout<<"最小公倍:"<<m*n/aim;
return 0;
}
int lcm(int a,int b)//lcm函数求最小公倍数
{
return a/gcd(a,b)*b;
}
代码(相减法)
有两整数a和b:
① 若a>b,则a=a-b
② 若a<b,则b=b-a
③ 若a=b,则a(或b)即为两数的最大公约数
④ 若a≠b,则再回去执行;
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a,b;
while((cin>>a>>b)!=NULL)
{
int gcd=0; //Greatest Common Divisor 最大公约数;
int lcm=a*b; // Lowest Common Multiple 最小公倍数;
while(a!=b){
if(a>b){
a-=b;
}
else{
b-=a;
}
}
gcd=a;//或b
lcm=lcm/gcd;
printf("%d %d\n",gcd,lcm);
}
return 0;
}