文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

C语言求两个正整数的最大公约数示例代码

2024-04-02 19:55

关注

前言

两个正整数的最大公约数(Greatest Common Divisor, GCD)是能够整除这两个整数的最大整数。两个正整数的最大公约数的求法有多种解答,本文就三种方法做详细介绍:穷举法、欧几里得算法(辗转相除法)、递归方法。

我们从一道问题来引入:编写计算最大公约数的函数Gcd(),在主函数中调用该函数计算并输出从键盘任意输入的最大公约数。

1.穷举法

根据最大公约数的定义,我们可以采用一种最简单的方法——穷举法来编写代码。由于a和b的最大公约数不可能比a和b中的较小者还大,否则一定不能整除它,因此,先找到a和b中的较小者t,然后从t开始逐次减1尝试每种可能,即检验t到1之间的所有整数,第一个满足公约数条件的t,就是a和b的最大公约数。据此我们可编写函数Gcd()如下:


//函数功能:计算a和b的最大公约数,输入负数时返回-1
int Gcd(int a, int b)
{
    int i, t;
    if (a <=0 || b <= 0)
        return -1;
    t = a < b ? a : b;
    for (i=t; i>0; i--)
    {
        if (a%i==0 && b%i==0)
            return i;
    }
    return 1;
}

这种方法简单暴力,思维量小,但效率较低,且当两个正整数都较大,且最大公约数为1时,循环的次数为较小数的值,可想而知所需时间会很长。

2.欧几里得算法(辗转相除法)

下面介绍一种求最大公约数较常用的办法:欧几里得算法(辗转相除法)。

忽略数学原理,我们有如下算法:对正整数a和b,连续进行求余运算,直到余数为0为止,此时非0的除数就是最大公约数。设 r=a mod b 表示a除以b的余数,若 r≠0 ,则将b作为新的a,r作为新的b,重复 a mod b 运算,直到 r=0 为止,此时b为所求的最大公约数。例如,50和15的最大公约数的求解过程可表示为:Gcd(50, 15)=Gcd(15, 5)=Gcd(5, 0)=5。

用这种算法可编写函数Gcd()如下:


//函数功能:计算a和b的最大公约数,输入负数时返回-1
int Gcd(int a, int b)
{
    int r;
    if (a <= 0 || b <= 0)
        return -1;
    do{
        r = a % b;
        a = b;
        b = r;
    } while (r != 0);
    return a;
}

我们也可以考虑使用递归实现如下:


//函数功能:计算a和b的最大公约数,输入负数时返回-1
int Gcd(int a, int b)
{
    if (a <= 0 || b <= 0)
        return -1;
    if (a % b == 0)
        return b;
    else
        return Gcd(b, a % b);
}

3.递归方法

对于最大公约数,还有3条性质:

性质1 如果 a>b,则a和b与a-b和b的最大公约数相同;

性质2 如果 b>a,则a和b与a和b-a的最大公约数相同;

性质3 如果 a=b,则a和b的最大公约数与a值和b值相同。

对正整数a和b,当 a>b 时,若a中含有与b相同的公约数,则a中去掉b后剩余的部分a-b中也应含有与b相同的公约数,对a-b和b计算公约数就相当于对a和b计算公约数。反复使用最大公约数的3条性质,直到a和b相等为止,这时,a或b就是它们的最大公约数。

这就是所谓的第三种方法:递归方法。虽然此法被称为递归方法,但只是思想方法运用了递归的方法,并不代表只能使用递归实现。我们同样可以通过非递归和递归两种手段编写函数Gcd()。非递归实现如下:


//函数功能:计算a和b的最大公约数,输入负数时返回-1
int Gcd(int a, int b)
{
    if (a <= 0 || b <= 0)
        return -1;
    while (a != b)
    {
        if (a > b)
            a = a - b;
        else if (b > a)
            b = b - a;
    }
    return a;
}

编写递归函数如下:


//函数功能:计算a和b的最大公约数,输入负数时返回-1
int Gcd(int a, int b)
{
    if (a <= 0 || b <= 0)
        return -1;
    if (a == b)
        return a;
    else if (a > b)
        return Gcd(a-b, b);
    else
        return Gcd(a, b-a);
}

以上就是三种计算最大公约数的算法,可使用如下主函数来调用函数Gcd(),计算最大公约数:


#include <stdio.h>
int Gcd(int a, int b);
int main(void)
{
    int a, b, c;
    printf("Input a,b:");
    scanf("%d,%d", &a, &b);
    c = Gcd(a,b);
    if (c != -1)
        printf("Greatest Common Divisor of %d and %d is %d\n", a, b, c);
    else
        printf("Input number should be positive!\n");
    return 0;
}

求两个正整数的最大公约数的过程,实质上是使用最大公约数的定义及性质求解的过程,对此感兴趣的伙伴们可以自己研究相关数学原理与证明。

附:相减法

这种方法比较易于理解,原理是先判断两个正整数大小,并将较大数与较小数的差值赋给较大数,循环此步骤直到两数相等,此时得出最大公约数。

代码如下:


#include<stdio.h>

int main()

{

	int m,n;

	printf("请输入两个正整数:");

	scanf("%d %d",&m,&n);

	printf("%d%和%d的最大公约数是",m,n);

    while(m!=n)

	{

		if(m>n)

		{

			m=m-n;

		}else

		{

			n=n-m;

		}	

	}

	printf("%d",n);

	return 0;

} 

参考文献:

苏小红 王甜甜 赵玲玲 范江波 车万翔 等编著 王宇颖 主审,C语言程序设计学习指导(第4版),高等教育出版社,P57-60.

总结

到此这篇关于C语言求两个正整数的最大公约数的文章就介绍到这了,更多相关C语言两正整数最大公约数内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯