最大公约数:若整数g为整数a,b的公约数,则g满足 a=g*l; b=g*m; 其中l ,m为整数。
a=b*k+r。k为整数,r为a除以b后的余数。则g*l=g*m*k+r, r=g*(l-m*k);(g!=0)
因此,a,b的公约数可以整除a除以b剩余的余数,即a mod b。即a,b的公约数也是a mod b的公约数。若g是a,b的最大公约数,则g也是a,a mod b的最大公约数。
1.输入两个正整数,求最大公约数。
样例输入:49 14
样例输出:7
#include<stdio.h>
int gcd(int a,int b)
{
if (b==0) return a;//若b为0,最大公约数为a
else return gcd(b,a%b);//否则,则改为求b与a%b的最大公约数
}
int main()
{
int a,b;
while(scanf("%d%d",&a,&b)!=EOF)
printf("%d\n",gcd(a,b));
return 0;
}
最大公约数的非递归形式:
#include<stdio.h>
int gcd(int a,int b)
{
while(b!=0)//只要b不为0
{
int t=a%b;
a=b;//使a变成b
b=t;//使b变成a%b
}
return a;
}
int main()
{
int a,b;
while(scanf("%d%d",&a,&b)!=EOF)
{
printf("%d\n",gcd(a,b));
}
return 0;
}
2.给定两个正整数,计算这两个数的最小公倍数
样例输入:10 14样例输出:70
思路:a,b的最小公倍数为俩数的乘积除以他们的最大公约数。证明如下:
#include<stdio.h>
int gcd(int a,int b)
{//求最大公约数
return b!=0 ? gcd(b,a%b):a;
}
int main()
{
int a,b;
while(scanf("%d%d",&a,&b)!=EOF)
{
printf("%d\n",a*b/gcd(a,b));//输出两数乘积与最大公约数的商
}
}