求最大公因数(辗转相除,更相止损)C++描述
Posted 归止于飞
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求最大公因数(辗转相除,更相止损)C++描述相关的知识,希望对你有一定的参考价值。
目录
辗转相除法与更相减损法
辗转相除法
如何求最大公因数?欧几里得先生提出了辗转相除法,这也是已知最古老的算法。
这个算法基于一个定理:
两个正整数a和b(a>b),它们的最大公约数等于a除以b的余数c和b之间的最大公约数。
更相止损法
当a,b两数较大时,求模的运算性能较低,我们就需要运用到刘徽先生的《九章算术》里的算法,更相止损法。
它遵循的定理是:两个正整数a和b(a>b),它们的最大公约数等于a-b的差值c和较小数b的最大公约数。
利用C++实现
我们可以用递归/迭代的方法实现这样两个算法.
/* 记录更相止损法与辗转相除法 */
#include <iostream>
using namespace std;
//辗转相除法
void zhanzhuan(int a, int b);
//更相止损法
void gengxiang(int a, int b);
//辗转相除的辅助函数
void f_zhanzhuan(int a, int b);
//更相止损法的辅助函数
void f_gengxiang(int a, int b);
//确定数字的大小为左大右小
void f_min(int& a, int& b);
int main()
int numberA, numberB;
cout << "请输入两个数:";
cin >> numberA >> numberB;
zhanzhuan(numberA, numberB);
cout << "请输入两个数:";
cin >> numberA >> numberB;
gengxiang(numberA, numberB);
//将终端暂停
cin.get();
cin.get();
return 0;
void zhanzhuan(int a, int b)
f_min(a, b);
f_zhanzhuan(a, b);
void f_zhanzhuan(int a, int b)
int c,temp;
while (1)
if (a % b == 0)
c = b;
break;
else
temp = b;
b = a % b;
a = temp;
cout << c << endl;
void gengxiang(int a, int b)
f_min(a, b);
f_gengxiang(a, b);
void f_gengxiang(int a, int b)
int c, temp;
while (1)
if (a == b)
c = a;
break;
else
temp = a - b;
f_min(b,temp);
a = b;
b = temp;
cout << c << endl;
void f_min(int& a, int& b)
int temp;
if (a < b)
temp = a;
a = b;
b = temp;
总结
这里用的是比较暴力的迭代,但是换成递归的话应该会更加优雅。
此外我利用了几个辅助函数以便于代码的重用,其实也可以用选择语句代替。
以上是关于求最大公因数(辗转相除,更相止损)C++描述的主要内容,如果未能解决你的问题,请参考以下文章