求N个数的最大公约数和最小公倍数以及Hankson"逆问题"(python)
一、题目要求
1.基本要求:
求N个数的最大公约数和最小公倍数。用C或C++或java或python语言实现程序解决问题
2.提高要求:
已知正整数a0,a1,b0,b1,设某未知正整数x满足:
(1)x和a0的最大公约数是a1;
(2)x和b0的最小公倍数是b1。
输入数据保证a0能被a1整除,b1能被b0整除。
对于每组数据:若不存在这样的x,请输出0;
若存在这样的x,请输出满足条件的x的个数;
二、算法设计
1.题目分析
基本要求:
n个数的最大公约数的求解,首先要输入n个数,并将数字进行保存。求解时求两个的最大公约数gcd(x1,x2),再将所得的数与第三个求解最大公约数gcd( gcd(x1,x2) , x3 )……如此递归调用即可求出n个数的最大公约数。
n个数的最小公倍数的求解,首先求两个的最小公倍数(x1x2)/gcd(x1,x2),再将所得的最小公倍数与第三个求最小公倍数,……,如此递归调用即可求出n个数的最小公倍数。
提高要求:
对题意进行分析,是将一次最大公约数求解和一次最小公倍数求解作为判断条件并求解,得出以下等式:
a1 = gcd( x , a0)
b1 = x * b0 / gcd( x , b0)
在输入时的判断条件:
a1 % a0 == 0
b1 % a1 == 0
2.算法设计
基于Python3.7
2.1对于求n个数的最大公约数和最小公倍数
(1)输入n个数,将输入的n个数保存至列表,利用append()函数添加至列表尾端,利用列表解决了存在数组里面,数组大小过小或者过大的问题
(2)求解最大公约数时,利用列表中的pop()函数从列表尾端连续删除两个数并返回这两个数的值,对两个数进行最大公约数函数调用得出一个结果,将结果利用append()添加至列表尾端
(3)重复(2)中的操作,直到列表中只剩下一个值时结束,仅剩的一个值就是n个数的最大公约数。
(4)求解最小公倍数时,利用列表中的pop()函数从列表尾端连续删除两个数并返回这两个数的值,对两个数进行最小公倍数的求解,将结果利用append()添加至列表尾端
(5)重复(4)中的操作,直到列表中只剩下一个值时结束,仅剩的一个值就是n个数的最小公倍数。
2.2 Hankson’逆问题’的求解
(1)输入n组数,每组数要求4个正整数,利用while(n 4 != count)进行判断输入的数的个数。
(2)将输入的数利用append()函数全部添加至列表中,再利用range()将长列表变成n个包含四个数的子列表。
(3)利用for语句将每个子列表取出,对子列表中的数利用a1 % a0 == 0 和b1 % a1 == 0进行正确性判断,符合输入要求则进行求解,否则输出数据有误。
(4)求解过程,定义一个计数器,将x从a1开始自增,利用a1 = gcd( x , a0),b1 = x * b0 / gcd( x , b0)进行判断,符合要求计数器+1,直到x增加到b1.
然后输出计数器中的值。
三、算法示意图
1.求最大公约数:
2.求最小公倍数:
3.Hankson“逆问题”:
四、源代码
"""
功能:1.求N个数的最大公约数和最小公倍数.
2.已知正整数a0,a1,b0,b1,设某未知正整数x满足:
(1)x和a0的最大公约数是a1
(2)x和b0的最小公倍数是b1
输入数据保证a0能被a1整除,b1能被b0整除。
对于每组数据:若不存在这样的x,请输出0;
若存在这样的x,请输出满足条件的x的个数;
作者:Elf.苏洛曦
修改历史:
1. 2019-03-20 创建,完成功能1
2. 2019-03-21 完善功能1,完成功能2
"""
def gcd(a , b):
"""求最大公约数函数"""
if a < b:
a , b = b , a
while b != 0:
temp = a % b
a = b
b = temp
return a
def setNumber():
n = int( input('您想输入数的个数:')