今天碰到一道C++练习题“求两个整数的最小公倍数和最大公约数的算法及其C++实现”,感觉可以做个整理笔记。
最大公约数
最大公约数(英语:Greatest Common Divisor,简写为G.C.D.;或Highest Common Factor,简写为H.C.F.),指某几个整数共有约数中最大的一个。
求两个整数最大公约数主要的方法:
C++实现
#include
int main()
{
int a,b,c;
scanf("%d %d",&a,&b);
if(a!=0&&b!=0) //先判断输入整数中有无零值,有零值的话无法求公约数返回error;
{
do{
c=a%b;
a=b;
b=c;
}while(c);
}
else
printf("error\n");
printf("%d\n",a);
return 0;
}
#include
#include
int main()
{
int a,b,n=0;
scanf("%d %d",&a,&b);
if(a!=0&&b!=0) //先判断输入整数中有无零值,有零值的话无法求公约数返回error;
{
while(a%2==0&&b%2==0)
{
a/=2;
b/=2;
n++;
}
while(a!=b)
{
(a>b)?a-=b:b-=a;
}
a=a*pow(2,n);
printf("%d\n",a);
}
else
printf("error\n");
return 0;
}
#include
int gcd(int n,int m) //适用于计算很大的数的最大公约数;
{
if(n==m)
return n;
else if(n==0) //不明白这个算法为什么有零值还能求公约数,后头再查查
return m;
else if(m==0)
return n;
else if(m>n)
return gcd(m,n);
if(n%2==0)
{
if(m%2==0)
return gcd(n>>1,m>>1)<<1;
else
return gcd(n>>1,m);
}
else
{
if(m%2==0)
return gcd(n,m>>1);
else
return gcd((n-m)>>1,m);
}
}
int main()
{
int a,b;
scanf("%d %d",&a,&b);
printf("%d\n",gcd(a,b));
return 0;
}
最小公倍数
最小公倍数是数论中的一个概念。若有一个数X,可以被另外两个数A、B整除,且X大于(或等于)A和B,则X为A和B的公倍数。A和B的公倍数有无限个,而所有的公倍数中,最小的公倍数就叫做最小公倍数。两个整数公有的倍数称为它们的公倍数,其中最小的一个正整数称为它们两个的最小公倍数。同样地,若干个整数公有的倍数中最小的正整数称为它们的最小公倍数。n整数 a1,a2,…,an的最小公倍数一般记作: [a1,a2,…,an],或者参照英文记法记作 lcm(a1,a2,…,an),其中lcm是英语中“最小公倍数”一词(lowest common multiple)的首字母缩写。
例如,十天干和十二地支的混合称为一个阴历年,干支循环回归同一名称的所需时间,就是12和10的最小公倍数,即是60──一个“甲子”。
(摘自维基百科)
C++算法实现
根据最大公约数来求最小公倍数,以辗转相除法为例:
#include
int main()
{
int a,b,c,n,m;
scanf("%d %d",&n,&m);
if(n!=0&&m!=0) //先判断输入整数中有无零值,有零值的话无法求公约数返回error;
{
a=n;
b=m;
do{
c=a%b;
a=b;
b=c;
}while(c);
}
else
printf("error\n");
printf("%d\n",n*m/a);
return 0;
}