第二次上课

一、 题目:

基本要求: 求N个数的最大公约数和最小公倍数。用C或C++或java或python语言实现程序解决问题。

提高要求:

一个“求公约数”和“求公倍数”之类问题的“逆问题”,这个问题是这样的:已知正整数a0,a1,b0,b1,设某未知正整数x满足:

1、 x和a0的最大公约数是a1;

2、 x和b0的最小公倍数是b1。

输入格式

输入第一行为一个正整数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> 先求2个数的最大公约数和最小公倍数

2> 然后将结果和第三个数继续求最大公约数最小公倍数

3> 同理一直求,直到所有数都求一遍 结束条件为b1和n=0

Python利用for求正整数的所有约数 python求正整数n的所有约数_最小公倍数


提高要求:

1> 先输入n行数据,用列表保存

2> 先取第一行数据,采用枚举法一个个匹配结果是不是和a1,b1一致,如果一致则++

3> 结束条件为b1和n=0

Python利用for求正整数的所有约数 python求正整数n的所有约数_数据_02


三、 测试,运行结果

1> 基本输入的insert()函数

Python利用for求正整数的所有约数 python求正整数n的所有约数_最小公倍数_03


2> n个数的最大公约数can()函数

Python利用for求正整数的所有约数 python求正整数n的所有约数_数据_04


3> n个数的最小公倍数can2()

Python利用for求正整数的所有约数 python求正整数n的所有约数_数据_05

4> 提高输入的insert1()函数

Python利用for求正整数的所有约数 python求正整数n的所有约数_最小公倍数_06


5> Panduan()函数

Python利用for求正整数的所有约数 python求正整数n的所有约数_数据_07

6> 运行结果:

Python利用for求正整数的所有约数 python求正整数n的所有约数_数据_08

四、 总结

  1. input()函数输入带着换行,不能在一行中输入多个数据,我采用了split()函数能够在一行输入多个数据。
  2. 对n个数据求最大公约数等,我采用循环求的方法,用结果和另一个数接着求。
  3. 对于解方程一类的方法,最简单的就是枚举法,一个个比较,直到结果一致,输出,结束条件是b1 五、源代码
1.  `import math
 #基本要求
 num=list() #放入数据
 num1=list()#中间数据
 num2=list()#中间数据
 def insert(): #基本要求输入
 m=N
 while m>0:
 num.append(int(input()))
 m=m-1
 def can(): #n个数最大公约数
 a=0
 a=num[0]
 for i in range(1,len(num)):
 b=num[i]
 if (a<b) :
 temp=a
 a=b
 b=temp
 while b!=0: #辗转相除法
 temp=a%b
 a=b
 b=temp
 return a
 def can2(): #n个数最小公倍数
 a=num[0]
 for i in range(len(num)):
 b=num[i]
 p=a*b
 if (a < b):
 temp = a
 a = b
 b = temp
 while b != 0: #辗转相除法
 temp = a % b
 a = b
 b = temp
 a=p//a
 return a
 #insert()
 #print(“最大公约数为”,can())
 #print(“最小公倍数为”,can2())
 #提高要求
 def insert1():#提高输入
 n=int(input())
 while n>0:
 num1=input().split() #在一行输入,以列表形式
 num2 .append(num1)
 n=n-1
 #print(num2)
 def pandaun():#求x,y
 a=list()
 sum=0
 for i in range(len(num2)):
 a=num2[i] #取第i组列表
 num.append(int(a[0]))
 for j in range(1,1000):
 num.append(j)
 if(int(a[1])==can()):
 break
 else:
 num.pop() #保证列表里只有两个数
 num.clear()
 num.append(int(a[2]))
 for q in range(j,int(a[3])+1,j):
 num.append(q)
 if(can2()==int(a[3])):
 sum=sum+1
 num.pop()
 print(sum)
 num.clear()
 sum=0 #重置print(“普通要求”)
 N=int(input()) #数的个数
 insert()
 print(“最大公约数”,can())
 print(“最小公倍数”,can2())
 num.clear()
 print(“提高要求”)
 insert1()
 pandaun()
 `