例4.4 最大公约数 - 九度教程第47题(最大公约数GCD)

本文详细介绍了如何使用欧几里得算法解决九度教程第47题,即求两个正整数的最大公约数。通过递归和非递归两种方式实现,提供了完整的C语言代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最大公约数 - 九度教程第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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_39450145

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值