1. 求最大公约数
求最大公约数的过程:
若a、b全为零则它们的最大公约数不存在;若a、b其中之一为零,则它们的最大公约数为a、b中非零的那个;若a、b都不为零,则使新a=b;新b=a%b然后重复该过程。
所谓求a,b的最大公约数,就是求同时满足a%c=0、b%c=0的最大正整数c,即求能够同时整除a和b的最大正整数c。
非递归形式
#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; //当b为0时,a即为所求
}
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){
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;
}
2. 求最小公倍数
最小公倍数为两数乘积除以他们的最大公约数。
#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)); //输出两数乘积与最大公约数的商
}
return 0;
}