题目1056:最大公约数
时间限制:1 秒
内存限制:32 兆
特殊判题:否
-
题目描述:
-
输入两个正整数,求其最大公约数。
-
输入:
-
测试数据有多组,每组输入两个正整数。
-
输出:
-
对于每组输入,请输出其最大公约数。
-
样例输入:
-
49 14
-
样例输出:
-
7
思路:欧几里得算法
两个结论:1.a,b的公约数同时也必是b,a mod b的公约数
2.a,b的最大公约数同时也必是b,a mod b的最大公约数
过程:若a,b全为零则它们的最大公约数不存在;若a,b其中之一为零,则它们的最大公约数为a,b中非零的那个;若a,b都不为零,则使新a=b,新b=a%b然后重复该过程
方法一:非递归
#include <stdio.h>
int main(){
int a,b;
while(scanf("%d %d",&a,&b)==2){
while(b>0){
int tmp;
tmp = b;
b = a%b;
a = tmp;
}
printf("%d\n",a);
}
return 0;
}
/**************************************************************
Problem: 1056
User: zpy
Language: C++
Result: Accepted
Time:0 ms
Memory:1020 kb
****************************************************************/
方法二:递归
#include <stdio.h>
int gcd(int a,int b){
if(b==0)
return a;
else return gcd(b,a%b);
}
int main(){
int a,b;
while(scanf("%d %d",&a,&b)==2){
printf("%d\n",gcd(a,b));
}
return 0;
}
/**************************************************************
Problem: 1056
User: zpy
Language: C++
Result: Accepted
Time:0 ms
Memory:1020 kb
****************************************************************/