求N个数的最大公约数和最小公倍数以及Hankson"逆问题"(python)

本文详细介绍了如何使用Python解决求N个数的最大公约数和最小公倍数的问题,以及解决Hankson的逆问题。在算法设计部分,解释了如何通过递归调用和列表操作来实现这两个问题。同时,文章还展示了在解决Hankson逆问题时的错误和调试过程,以及最终得到的正确结果。

求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('您想输入数的个数:'))
    global list1
    list1 = []
    count = 0
    while (count < n):
        c = int(
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值