Problem Z: 求最大公约数
Description
两个数能同时被一个数所整除,这个数就是公约数。例如,12和20的公约数有1,2,4。其中4是12和20的最大公约数。
Input
输入两个正整数,用逗号分隔。
Output
输出这两个数的最大公约数。
Sample Input
24,60
Sample Output
12
该问题可以使用穷举法和辗转相除法来求最大公约数,其中,辗转相除法又可以采用使用递归和不使用递归两种形式。
穷举法源程序如下:
#include<stdio.h>
int main(){
int m,n,temp,commondivisor=1;
scanf("%d,%d",&m,&n);
//小的数放前边
if(m>n){
temp=n;
}
else
temp=m;
for(int i=temp;i>=1;i--){
if(m%i==0&&n%i==0){
commondivisor=i;
break;
}
}
printf("%d\n",commondivisor);
}
使用辗转相除法(递归)的方式,代码如下:
#include <stdio.h>
#include <stdlib.h>
int getdivisor(int a, int b)
{
int mod;
if ((mod = a % b) == 0)
return b;
return getdivisor(b, mod);
}
int main()
{
int m, n,ret;
scanf("%d,%d", &m,&n);
ret = getdivisor(m, n);
printf("%d", ret);
return 0;
}
使用辗转相除法(非递归)的方式,代码如下:
#include <stdio.h>
#include <stdlib.h>
int getdivisor(int a, int b)
{
int mod=a % b;
while (mod!=0)
{
a = b;
b = mod;
mod = a % b;
}
return b;
}
int main()
{
int m, n,ret;
scanf("%d,%d", &m,&n);
ret = getdivisor(m, n);
printf("%d", ret);
return 0;
}```