7-26 最大公约数和最小公倍数

分数 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;
}

//改了个主题,舒服多了嘿嘿

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值