求N个数的最大公约数和最小公倍数以及Hankson逆运算问题

一:题目要求:
1, 普通要求:

求n个数的最大公约数和最小公倍数,用C,C++或者Python解决问题。

2, 提高要求:

已知正整数a0,a1,b0,b1,设某未知正整数x满足:
(1):x和a0的最大公约数是a1;
(2):x和b0的最小公倍数是b1;
Hankson的“逆问题”就是求出满足条件的正整数x。但稍加思索之后,他发现这样的x并不唯一,甚至可能不存在。因此他转而开始考虑如何求解满足条件的x的个数。请编程求解这个问题。

输入格式:

输入第一行为一个正整数n,表示有n组输入数据。接下来的n行每行一组输入数据,为四个正整数a0,a1,b0,b1,每两个整数之间用一个空格隔开。输入数据保证a0能被a1整除,b1能被b0整除。

输出格式:

输出共n行。每组输入数据的输出结果占一行,为一个整数。对于每组数据:若不存在这样的x,请输出0;若存在这样的x,请输出满足条件的x的个数;

样例输入:

2

41 1 96 288

95 1 37 1776

样例输出

6

2

二:算法设计:

1, 基础要求:

基础要求中只要求出N个数的最大公约数和最小公倍数即可,我的思路是:仿照求两个数最大公约数的方法,先定义一个数组,将所有数字都存放在数组中,然后对其进行顺序统一运算即可。以下为代码截图及详细说明:

定义数组:
草泥马

定义最大公约数求法:
最大公约数
定义函数求最小公倍数:
在这里插入图片描述
提高要求具体实现:在这里插入图片描述

在这里插入图片描述
基础部分测试:

在这里插入图片描述
提高部分测试:
在这里插入图片描述
基础部分调试:
在这里插入图片描述
提高部分调试:
在这里插入图片描述
三:总结与归纳:

这次作业与之前“求两个数最大公约数与最小公倍数”相比,难在对多个数的储存和如何对多个数进行运算。通过这次作业我对辗转相除法的定义有了更深的理解:
(1)所谓辗转相除就是两数中的小数与大数相除得余数;然后余数与小数相除得第二个余数;第二个余数继续与第一个余数相除得第三个余数,以此类推最终余数为零时,较小的除数便为这N个数的最大公约数。
(2)求N个数,应该先对前两个数进行操作,得两者最大公约数后,再将该数与第三个数进行运算,以此类推最终得到结果。最小公倍数的求法亦相同。
(3)在做提高要求时最初的想法是:先求b0所有因数,然后用b1除b0的结果与b0所有因数相乘,将这些数放入数组中并剔除重复的数,随后将这些数分别与a0进行求最大公约数的运算,看结果是否为a1,实则满足要求,最终将这些满足要求的数字进行计数并将结果输出。
(4)最后便是 和班里一些同学相比自己的编程能力还有很大差距,这次的作业用Python编写会简单许多,在课余时间要开始有意对Python进行学习;其次对课本上的细节知识要理解,不能停留在只理解程序大体框架上,否则自己编程时会错误百出。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值