分数 15
作者 张彤彧
单位 浙江大学
本题要求两个给定正整数的最大公约数和最小公倍数。
输入格式:
输入在一行中给出两个正整数M和N(≤1000)。
输出格式:
在一行中顺序输出M和N的最大公约数和最小公倍数,两数字间以1空格分隔。
输入样例:
511 292
输出样例:
73 2044
鸣谢安阳师范学院段晓云老师和软件工程五班李富龙同学补充测试数据!
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
学到了求最大公约数和最小公倍数的方法:
最大公约数:
翁恺老师在前面就讲过,用辗转相除法非常方便(编写方便,没有熟练时我想起来不得劲儿。。。)即对于a和b,当b!=0时,添加余数t=a%b; 然后令a=b; b=t; 这样辗转下去,在b==0时跳出循环,最大公约数就是这时的a
*在网上搜索时发现有一个相同思路的版本:
z = x%y;
while (z)
{
x = y;
y = z;
z = x % y;
}
int maximum = y;
首先他直接令z作循环判断的条件,非常机智,因为跳出循环时是整除的情况,余数为0在()中代表false,其余情况为一个数字,计算机默认是true;用翁恺老师的话说:非常调皮的做法hhh(。
然后他这里相当于少了一次辗转赋值,因为没有最后一轮的原b,t向a左移,所以直接拿y当作最大公约数结果,本质上和翁老师的方法是一样的。因为我首先学习了翁老师的方式,这里就不调整了。
接着是计算最小公倍数的方法:
最小公倍数=两数之积/最大公约数;
可以说是非常简单了!
Ps:还有一种方法是判断三种情况:
比较大小确定a>b,(1)a%b==0时 minimum=b;
(2)a%b!=0时,互质-->minimum=a*b;
不互质-->a*i%b==0时的minimum=a*i;
emmm,我选择先算最大公约数( )
最后得出的代码:
// 最大公约数a b
// a b 余数t
// while(b!=0)
// a%b=t
// a=b
// b=t
// ->a
// 最小公倍数a b
// ->a*b/最大公约数
#include<stdio.h>
#include<stdlib.h>
int main(int argc, char const *argv[])
{
int a=0,b=0;
scanf("%d %d",&a,&b);
int A=a,B=b;
int t=a%b;
while(b){
t=a%b;
a=b;
b=t;
}
int maximum=a;
int minimum=A*B/maximum;
printf("%d %d\n",maximum,minimum);
system("pause");
return 0;
}
//改了个主题,舒服多了嘿嘿