最大公约数 - 九度教程第47题
题目
题目描述:
输入两个正整数,求其最大公约数。
输入:
测试数据有多组,每组输入两个正整数。
输出:
对于每组输入,请输出其最大公约数。
样例输入:
49 14
样例输出:
7
来源:
2011 年哈尔滨工业大学计算机研究生机试真题
解析:
利用一种高效的算法(欧几里得算法),求解最大公约数。
把求a、b的最大公约数转换成求b、a%b的最大公约数。
若a、b全为0,则它们的最大公约数不存在;若a、b其中之一为0,则它们的最大公约数为a、b中非零的那个;若a、b都不为0,则使新a=b,新b=a%b,然后重复该过程。
代码1:(递归)
#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)
{
while(b!=0) //只要b不为0则一直持续该过程
{
int x=a%b;
a=b; //使a变成b
b=x; //使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;
}