在python的标准库math中有一个gcd函数,其功能是计算两个数的最大公约数。请编写程序,从键盘输入两个整数,调用gcd函数求这两个整数的最大公约数。
输入样例:
16
20
输出样例:
4
import math
x = int(input())
y = int(input())
print(math.gcd(x, y))
不知道你这个问题是否已经解决, 如果还没有解决的话:int gcd(int a,int b){
if(b==0) return a;
else return gcd(b,a%b);
}
注意:两个数的乘积等于他们的最大公约数和最小公倍数的乘积。
解决方案:
根据题目,需要求出两个数的最大公约数,然后再根据最大公约数判断是否存在无法组成的最大整数。如果存在则用背包问题的思路求解不能凑出的数字的数量。
代码如下:
import math
# 求最大公约数
def gcd(a, b):
return math.gcd(a, b)
# 主要函数
def func():
# 输入两个数
a, b = map(int, input().split())
# 求最大公约数
r = gcd(a, b)
# 判断是否有无法组成的最大整数
if r != 1:
print(r)
return
# 背包问题求解不能凑出的数字的数量
dp = [False] * (a * b + 1)
dp[0] = True
for num in [a, b]:
for i in range(1, a * b // num + 1):
for j in range(a * b, -1, -1):
if j - num * i >= 0 and dp[j - num * i]:
dp[j] = True
ans = 0
for i in range(1, a * b + 1):
if not dp[i]:
ans += 1
print(ans)
# 测试
func()
首先,输入两个数a和b,然后用math库中的gcd函数求出这两个数的最大公约数r。如果r不等于1,则输出r,因为此时就不存在无法组成的最大整数。如果r等于1,则可以继续进行下一步的背包问题求解。
使用动态规划的思路,定义dp数组,dp[i]表示是否能够凑出数字i。初始状态,dp[0]=True,即数字0一定可以凑出。然后,对a和b分别进行循环,每次枚举它们的倍数,将相应的dp[i]标记为True。循环结束后,再次遍历dp数组,统计不能凑出的数字的数量ans,最后输出即可。