作者 王秀秀
单位 山东交通学院
任务描述
本关任务:输入两个正整数 m
和 n
,求其最大公约数和最小公倍数。
相关知识
求最小公倍数算法:
最小公倍数 = 两整数的乘积 ÷ 最大公约数
根据求最小公倍数的算法,可以看出如果已知最大公约数,就能很容易求出最小公倍数。而通过辗转相除法和相减法,可以求得最大公约数,下面分别进行介绍。
辗转相除法
已知有两整数a
和b
,利用辗转相除法求它们的最大公约数,具体步骤如下:
- ①
a%b
得余数t
; - ② 若
t=0
,则b
即为两数的最大公约数; - ③ 若
t≠0
,则a=b
,b=t
,再回去执行①。
举例说明:
已知a = 21 b = 28
,辗转相除法步骤如下:
- ① 执行
t = a%b = 21%28 = 21
, 则t = 21
,此时t
不为0
,进入循环; - ② 先执行
a = 28 ,b = 21
,再执行t = a%b = 28%21 = 7
,则t = 7
,此时t
不为0
; - ③ 先执行
a = 21 , b = 7
,再执行t = a%b = 21%7 = 0
,则t = 0
,循环结束,b=7
为最大公约数。
int a,b; int t = a % b; while( t ) { a = b; b = t; t = a%b; }
相减法
已知有两整数a
和b
,利用相减法求它们的最大公约数,具体步骤如下:
- ① 若
a > b
,则a = a-b
; - ② 若
a < b
,则b = b-a
; - ③ 若
a = b
,则a(或b)即为两数的最大公约数; - ④ 若
a ≠ b
,则再回去执行①。
例如求a=27
和b=15
的最大公约数过程为:
- ①
a = 27-15 = 12 b = 15
- ②
a = 12 b = 15-12 = 3
- ③
a = 12-3 = 9 b=3
- ④
a = 9-3 = 6 b=3
- ⑤
a = 6-3 = 3 b=3
因此,b = 3即为最大公约数。
编程要求
输入两个正整数m
和 n
,求其最大公约数和最小公倍数。
输入
从键盘上任意输入两个数。
输出
分两行输出,第一行输出:最大公约数是多少;第二行输出最小公倍数是多少。
测试说明
平台会对你编写的代码进行测试,若是与预期输出相同,则算通关。
测试输入:
14 36
预期输出:
最大公约数是:2
最小公倍数是:252
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
栈限制
8192 KB
#include <stdio.h>
#include <math.h>
int main() {
long long num1,num2,max,temp1,temp2,temp3,temp4;
long long num3 = 0;
scanf("%lld %lld",&num1,&num2);
num1 = llabs(num1);
num2 = llabs(num2);
temp1 = num1;
temp2 = num2;
if(num1==0 || num2==0){
printf("0");
return 0;
}
while (temp1 % temp2 != 0) {
temp4 = temp1;
temp3 = temp2;
temp2 = temp4 % temp2;
temp1 = temp3;
}
max = temp2;
num3 = num1/max;
printf("最大公约数是:%lld\n",max);
printf("最小公倍数是:%lld",num3*num2);
return 0;
}