解题思路:
在求解此题前我们需要先明白最大公约数与最小公倍数应该怎么求
1、最大公约数可用辗转相除法求解:
例如:288和123
288%123=2......42(此处得到42以备用)
123%42=2......39(此处得到39以备用)
42%39=1......3
39%3=13......0
那么此时,可以得到3就是288与123的最大公约数(百度上对辗转相除法有更详细的解释,但大概就是我写的这样,用两数中的较大数(288)取模较小数(123),得出的结果(42)作为下一项较小数,再把本项的较小数(123)作为下一项的较大数以此往复,直到余数为0,此时的较小数就是最开始两数的最大公约数)
2、最小公倍数可用公式法求解:
例如:288和123
最小公倍数=288*123/最大公约数(根据1可求出最大公约数为3)
在明白这两点后就可用递归的方法来求解此题了
注意事项:
在创建递归函数时需要依次传入两数中的较大数和较小数,同时需要额外传入一个中间变量用于接收较小数
参考代码:
#include<iostream>
using namespace std;
int dfs(int a, int b,int temp)//利用递归和辗转相除求解出最大公约数,其中temp为接收较小数b的中间变量
{
if(b==0)//设置退出条件为最后得到的余数为0,即在下一项是 a/b 中b=0时,则返回此时的a值即为最大公约数
{
return a;
}
temp = b;//提前存储b值以便后续使用
b = a % b;//把两数的余数当作下一项的b值
a = temp;//把上一项的b值当作下一项的a值
dfs(a, b, temp);//继续递归直到满足退出条件
}
int main()
{
int a, b;
cin >> a >> b;
int c = max(a, b);//找出两数中的较大数
int d = min(a, b);//找出两数中的较小数
cout << dfs(c, d, 0) << " " << a * b / dfs(c, d, 0);//第一项输出最大公约数,第二项用公式法输出最小公倍数
return 0;
}
0.0分
1 人评分
C语言程序设计教程(第三版)课后习题4.9 (C语言代码)浏览:1555 |
【偶数求和】 (C语言代码)浏览:674 |
C语言程序设计教程(第三版)课后习题9.10 (C语言代码)浏览:583 |
C语言程序设计教程(第三版)课后习题6.3 (C语言代码)from DQM浏览:773 |
C语言程序设计教程(第三版)课后习题4.9 (C语言代码)浏览:727 |
数对 (C语言代码)浏览:762 |
C语言程序设计教程(第三版)课后习题3.7 (C语言代码)浏览:561 |
【偶数求和】 (C语言代码)浏览:460 |
Tom数 (C语言代码)浏览:758 |
罗列完美数 (C语言代码)浏览:519 |