問題描述
小明開了一家糖果店。他別出心裁:把水果糖包成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沒有的值,即為所求。
上**:
#得到最小公倍數
defget_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 較小的值
defget_min
(i,j)
:if i>j:
min=j
else
:min
=i return
min#得到在公倍數範圍裡 ki表示最多有多少個i
defget_ki
(i,j)
: gbs=get_gbs(i,j)
ki=1while
true
:if ki*i
ki=ki+
1else
: ki = ki -
1break
return ki
##得到在公倍數範圍裡 ki表示最多有多少個j
defget_kj
(i,j)
: gbs = get_gbs(i, j)
kj =
1while
true
:if kj * j < gbs:
kj = kj +
1else
: kj = kj -
1break
return kj
#得到買不到的數目
defget_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)
:for a in
range
(ki+1)
:for b in
range
(kj+1)
: count=a*i+b*j
if count
# print(a, b)
# print(ki)
# print(kj)
print
(list1)
print
(list2)
#差集,list1裡有的數而list2無的數
temp=
list
(set
(list1)
.difference(
set(list2)))
#在這個數列 求最右邊的值 即最大
買不到的數目 藍橋杯
買不到的數目 藍橋杯 這是2013 年第四屆藍橋杯全國軟體大賽預賽a組 c c 組 第8 題,為程式設計題,本文提供了兩種解法。小明開了一家糖果店。他別出心裁 把水果糖包成 4顆一包和 7顆一包的兩種。糖果不能拆包賣。小朋友來買糖的時候,他就用這兩種包裝來組合。當然有些糖果數目是無法組合出來的,比如...
藍橋杯 買不到的數目
題目關鍵點分析 比如輸入為4和7,那麼只要出現至少連續的4個數可以被4和7組合出來,那麼後面的數字一定都可以被4和7組合出來。證明 比如18 19 20 21都是可以被4和7組合出來的,那麼後面的數都可以被4和7組合出來,比如22,就相當於18 4,既然18可以被4和7組合出來,那麼18 4即22也...
藍橋杯 買不到的數目
小明開了一家糖果店。他別出心裁 把水果糖包成4顆一包和7顆一包的兩種。糖果不能拆包賣。小朋友來買糖的時候,他就用這兩種包裝來組合。當然有些糖果數目是無法組合出來的,比如要買 10 顆糖。你可以用計算機測試一下,在這種包裝情況下,最大不能買到的數量是17。大於17的任何數字都可以用4和7組合出來。本題...