最大公约数:若整数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));//输出两数乘积与最大公约数的商 } }