python求一个整数的最大公约数_算法交流:7592 求最大公约数问题【2.1基本算法之递归和自调用函数】...

77d138e11aaa7cbbb6c86bf74ef0f3b2.png

【题目描述】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));

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值