求n个数的最大公约数和最小公倍数,m和n的最小公倍数是m,m和n的最大公因数是多少

  求n个数的最大公约数和最小公倍数,m和n的最小公倍数是m,m和n的最大公因数是多少

  求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)的最小公倍数,再求第三个数的最小公倍数,求第三个数的最小公倍数

  提高要求:

  为了分析问题的意义,将最大公约数的解和最小公倍数的解作为判断条件,进行求解,得到如下方程:

  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汉克森“反问题”的解决

  (1)输入n组的个数,每组要求4个正整数,用while(n ^ 4!=count)来判断输入数字的个数。

  (2)使用append()函数将所有输入的数字加到列表中,然后使用range()将长列表变成N个四个数字的子列表。

  (3)用for语句取出每个子表,用a1% a0==0和b1% a1==0判断子表中数字的正确性。如果它们满足输入要求,则解决它们;否则,输出数据是错误的。

  (4)在求解过程中,定义一个计数器,从a1开始增加x,用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的个数;作者:精灵。高大上音频修改历史:1。2019-03-20.已创建,已完成功能1 2。2019-03-21.完美函数1、完成函数2 2def gcd(a,B): 求最大公约数函数 If A B: A,B==0:temp=A % B A=B B=temp return adef set number():n=int(input(要输入的数字个数:))global list 1 list 1=[]count=0 while(count n):c=int(input(请输入:)):print(您输入的数字有误,请重新输入:)c=1append(c)count=1 print(list 1)def compare():list 2=list(set(list 1))list 3=list 2[:]# list copy # while求n个数的最大公约数=1:a1=list 2 . pop()B1=list 2 . pop()c=gcd(a1,B1)list 2 . append(c)# while len(list 3)!=1:a2=list 3 . pop()B2=list 3 . pop()C2=gcd(a2,B2)d=((a2 * B2)//C2)list 3 . append(d)print(您输入的所有数字的最大公约数是:,End=) print(您输入的所有数字的最小公倍数是:,End= )print(list 3[0])def getx():global list 4 list 4=[]count=0 want=0 n1=int(input(请请确保第一个数字能被第二个数字整除,第四个数字能被第三个数字整除。=count):c=int(input( Please enter:))while(c=0):print(您输入的数字是错误的,请重新输入:)c=int(input( Please enter:))list 4 . append(c)#将输入的数字添加到列表count=1 list 5=[list 4[I:I 4]for I in range(0,len (list4),4)] #添加长列表的数目,子列表全局count1 # x的count #遍历子并对list5中I的每个单词列表中的四个数进行运算:list5=i #取出子列表count1=0 #判断是否满足输入要求if (list5[0]% list5[1]!=0或list5[3] % list5[2]!=0): print(i,end=) print(该组数据不满足输入要求)else: for x in range (list5 [1],list5 [3] 1): if ((GCD (x,List 5[0]==List 5[1]))and(List 5[2])==List 5[3]):count 1=1 print(I)print( 1 .求n个数的最大公约数和最小公倍数)打印( 2。汉克森‘反问题的解’)n=int(input(‘please=1和n!=2): print(您输入的序列号超出范围)n=int(input(请输入您要执行的操作的序列号:))if(n==1):set number()compare()if(n==2):getx()

五、调试和测试

  1.错误和解决方案

  (1)有一个错误:

  在没有错误提示的情况下,测试求n个数的最大公约数和最小公倍数的函数时出现以下错误:

  当pop()删除数据时,列表已经是空的,提示错误在第33行。

  解决方法:通过逻辑思维,发现列表中的数字不一定都要弹出来进行运算,最后列表中会留下一个数字,剩下的数字就是想要的结果。将判断语句更改为:

  程序被正确执行。

  (2)错误:在没有提示错误的情况下测试Hankson“逆问题”,结果如下:

  输入正确的测试数据后,多次输出0~5。

  解决方法:调试后发现print(count1)函数是执行的结果,可以确定print()函数在嵌套层次有问题。分析后,print()缩进到正确的位置,输出结果如下:

  发现计数器的值与正确答案不匹配,检查语句,并考虑x的取值范围,因此在for下添加以下代码:

  输出结果如下:

  x的值只有287,而不是288,所以我们认识到切片函数range()包含左数,但不包含右数。这是正确的数字1,所以包括它。

  再次测试,结果正确。

2运行结果图

  2.1.求最大公约数和最小公倍数:

  输入四个数字12,32,5,6。运行结果如下:

  输入三个数字,当输入为负整数和0时,提示错误并重新输入:

  2.汉克森的“逆问题”:

  求解一组数,在数输入前给出四个数的要求,输入完成后给出四个数和求解结果:

  求解3组数字,输入数字前给出4个数字的要求,输入负整数和0提示错误,重新输入。结果如下:

  如果不按照提示操作,不符合输入的要求,就会输出错误。如果没有满足要求的X,则X的数量输出为0。

  

六、总结

  通过这个编程,我更熟悉了求最小公倍数和最大公约数。同时对递归调用有了更深的理解,对python也有了更好的理解。体会到了python语言的强大,却发现了学习python的一些不足。这个编码中,变量名的使用不够规范,没有达到见名知义的目的。同时,功能中的功能混杂,功能没有模块化。我学到了更多的列表操作,比如把一个长列表变成多个子列表的和,拷贝和浅拷贝列表,用子列表遍历列表。更重要的是,你学会了问题的思维方法和处理方法,可以把问题中的重要信息用数学的方式公式化,更容易看到解决问题的关键。

求n个数的最大公约数和最小公倍数,m和n的最小公倍数是m,m和n的最大公因数是多少