这篇文章主要介绍“C语言怎么求两个正整数的最大公约数”,在日常操作中,相信很多人在C语言怎么求两个正整数的最大公约数问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言怎么求两个正整数的最大公约数”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
两个正整数的最大公约数(Greatest Common Divisor, GCD)是能够整除这两个整数的最大整数。两个正整数的最大公约数的求法有多种解答,本文就三种方法做详细介绍:穷举法、欧几里得算法(辗转相除法)、递归方法。
我们从一道问题来引入:编写计算最大公约数的函数Gcd(),在主函数中调用该函数计算并输出从键盘任意输入的最大公约数。
根据最大公约数的定义,我们可以采用一种最简单的方法——穷举法来编写代码。由于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时,循环的次数为较小数的值,可想而知所需时间会很长。
下面介绍一种求最大公约数较常用的办法:欧几里得算法(辗转相除法)。
忽略数学原理,我们有如下算法:对正整数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条性质:
性质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语言怎么求两个正整数的最大公约数”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。