题目
求两个不相等正整数的最大公约数gcd/hcf
思路1:欧几里得法(辗转相除法)
欧几里得法(辗转相除法):欧几里得算法又称辗转相除法,是指用于计算两个非负整数a,b的最大公约数。
假如需要求 1997 和 615 两个正整数的最大公约数,用欧几里得算法,是这样进行的:
1997 / 615 = 3 (余 152)
615 / 152 = 4(余7)
152 / 7 = 21(余5)
7 / 5 = 1 (余2)
5 / 2 = 2 (余1)
2 / 1 = 2 (余0)
至此,最大公约数为1
以除数和余数反复做除法运算,当余数为 0 时,取当前算式除数为最大公约数,所以就得出了 1997 和 615 的最大公约数 1。
代码
#include <iostream>
using namespace std;
int main (){
int a,b,c,re;
cout << "这是一个求两数最大公约数的程序!" << endl;
cout << "请输入第一个数字:" ;
cin >> a;
cout << "请输入第二个数字:" ;
cin >> b;
c = a; // 由于ab大小不确定,此处还做了判断处理,以保证大数据除以小数据
if(a > b){
a = b;
b = c;
}
re = b % a;
while(re>0){
b = a;
a = re;
re = b % a;
}
cout <<"这两个数的最大公约数为:" << a;
}
思路2:
代码
#include <iostream>
using namespace std;
int main()
{
int n1, n2;
cout << "输入两个整数: ";
cin >> n1 >> n2;
while(n1 != n2)
{
if(n1 > n2)
n1 -= n2;
else
n2 -= n1;
}
cout << "HCF = " << n1;
return 0;
}
思路3:
代码
#include <iostream>
using namespace std;
int main() {
int n1, n2, hcf;
cout << "输入两个整数: ";
cin >> n1 >> n2;
// 如果 n2 大于 n1 交换两个变量
if ( n2 > n1) {
int temp = n2;
n2 = n1;
n1 = temp;
}
for (int i = 1; i <= n2; ++i) {
if (n1 % i == 0 && n2 % i ==0) {
hcf = i;
}
}
cout << "HCF = " << hcf;
return 0;
}
注:思路23来自菜鸟教程 求两数最大公约数