最大公约数
直接记一个数学结论:两个数a和b,a和b的公约数与b与a%b的公约数完全相同,故其最大公约数也相同。即:gcd(a,b)=gcd(b,a%b)
当a<b时,函数即为交换a和b的顺序。
此外,0和任意整数的最大公约数都是a,这是递归边界。
#include<stdio.h>
#include<math.h>
int gcd(int a,int b){
if(b==0)
return a;
return gcd(b,a%b);
}
int main(){
int a,b;
int ans;
while(scanf("%d%d",&a,&b)!=EOF){
ans=gcd(a,b);
printf("%d\n",ans);
}
return 0;
}
最小公倍数
对于给定两个数a和b,若其最大公约数为d,则其最小公倍数为 ab/d
为了防止ab超出范围,改变顺序 a/d*b
求一组数的最小公倍数:
数据有n组,每组输入格式:m m个整数
#include<stdio.h>
#include<math.h>
int gcd(int a,int b){
if(b==0)return a;
return gcd(b,a%b);
}
int lcm(int a,int b){//求最小公倍数
return a/gcd(a,b)*b;
}
int main(){
int n;
scanf("%d",&n);
int m;
int num;
int t;
while(n--){//注意这种写法,是进行m-1次循环
scanf("%d%d",&m,&num);
while(--m){
scanf("%d",&t);
num=lcm(num,t);
}
printf("%d\n",num);
}
return 0;
}