【题目描述】7592 求最大公约数问题 By OIer15WA
给定两个正整数,求它们的最大公约数。
输入
输入一行,包含两个正整数(<1000000000)
输出
输出一个正整数,即这两个正整数的最大公约数。【样例输入】
6 9
【样例输出】
3
一、题意分析
求两个正整数的最大公约数,即所求的数为两个正整数中最大的公共因数。二、算法说明
第一种方法:用一个for循环,将i从两个数中最小的数开始循环到1.当这两个数第一次同时被整除时,输出i。这时i即最大公因数。
第二种方法:用递归思想,利用辗转相除法。假设a > b > 0,那么a和b的最大公约数等于b和a%b的最大公约数,然后把b和a%b作为新一轮的输入。由于这个过程会一直递减,直到a%b等于0的时候,b的值就是所要求的最大公约数。用一个函数来实现这个功能。三、数据结构
无四、算法分析
刚开始用的第一种方法,思想比较简单,用for循环来求公约数。代码也比较好打。但是提交过后运行时间却比较长。
后来看到题目提示的辗转相除法,就想到用递归就比较容易实现。但是递归函数却要认真思考该怎么打。刚开始提交显示错误。后来将两个语句调换了一下顺序就accepted了。运行时间非常少。五、代码与调试
非递归:
#include<stdio.h>
int main()
{
long long int a,b,i,t;
scanf("%d%d",&a,&b);
if(a<b)
{
t=a;
a=b;
b=t;
}
for(i=b;i>=1;i--)
{
if(a%i==0&&b%i==0)
break;
}
printf("%d",i);
return 0;}
递归:
#include<stdio.h>
int f(long long int a,long long int b)
{
if(a%b==0)
return(b);
return(f(b,a%b));
}
int main()
{
long long int a,b,t;
scanf("%d%d",&a,&b);
if(a<b)
{ t=a;
a=b;
b=t;
}
b=f(a,b);
printf("%d",b);
}
递归:
刚开始提交显示错误。后来将两个语句调换了一下顺序就accepted了。运行时间非常少。
if(a%b==0)
return(b);
f(b,a%b);
改为:
if(a%b==0)
return(b);
return(f(b,a%b));