蓝桥杯真题——买不到的数目

问题描述
小明开了一家糖果店。他别出心裁:把水果糖包成4颗一包和7颗一包的两种。糖果不能拆包卖。

小朋友来买糖的时候,他就用这两种包装来组合。当然有些糖果数目是无法组合出来的,比如要买 10 颗糖。

你可以用计算机测试一下,在这种包装情况下,最大不能买到的数量是17。大于17的任何数字都可以用4和7组合出来。

本题的要求就是在已知两个包装的数量时,求最大不能组合出的数字。

输入格式
两个正整数,表示每种包装中糖的颗数(都不多于1000)

输出格式
一个正整数,表示最大不能买到的糖数

样例输入1
4 7
样例输出1
17
样例输入2
3 5
样例输出2
7

我的思路
倘若输入数据分别为 i j
这个买不到的数 范围 大于最小值 小于公倍数
首先找出最小公约数
然后两数相乘除以最小公约数=最小公倍数
然后将这个范围的数存入列表list1
然后根据最小公倍数,极限估计 求出 ,在公倍数里,有多少个 i或j。
然后据此拼凑 可能出现的值 count=iki+jkj
然后通过 count必须小于最小公倍数 ,筛选出 在买不到数范围里的值,并存入list2
然后通过差集,筛选出 list1里有的值,list2没有的值,即为所求。

上代码:

#得到最小公倍数
def get_gbs(i,j):
    I=i
    J=j
    #得到最小公约数
    while i!=j:
        if i>j:
            i=i-j
        else:
            j=j-i
    gbs=int(I*J/i)
    return gbs
#得到i j 较小的值
def get_min(i,j):
    if i>j:
        min=j
    else:
        min=i
    return min
#得到在公倍数范围里 ki表示最多有多少个i
def get_ki(i,j):
    gbs=get_gbs(i,j)
    ki=1
    while True:
        if ki*i<gbs:
            ki=ki+1
        else:
            ki = ki - 1
            break

    return ki
##得到在公倍数范围里 ki表示最多有多少个j
def get_kj(i,j):
    gbs = get_gbs(i, j)
    kj = 1
    while True:
        if kj * j < gbs:
            kj = kj + 1
        else:
            kj = kj - 1
            break
    return kj
#得到买不到的数目
def get_getnonum(i,j):
    min=get_min(i,j)
    gbs=get_gbs(i,j)
    ki=get_ki(i,j)
    kj=get_kj(i,j)
    list1=[]
    list2=[]
    for l in range(min+1,gbs):
        list1.append(l)
    for a in range(ki+1):
        for b in range(kj+1):
            count=a*i+b*j
            if count<gbs and count!=0:
                # print(a, b)
                list2.append(count)

    # print(ki)
    # print(kj)
    print(list1)
    print(list2)
    #差集,list1里有的数而list2无的数
    temp=list(set(list1).difference(set(list2)))
	#在这个数列 求最右边的值 即最大
    print(temp[len(temp)-1])

if __name__ == '__main__':
    str=input()
    str=list(map(int,str.strip().split()))
    i=str[0]
    j=str[1]
    get_getnonum(i,j)

蓝桥杯真题——买不到的数目_第1张图片

你可能感兴趣的:(蓝桥杯)