有兩個數字,分別大於1,也分別小於50
Dora把這兩個數字的乘積告訴了Allen
Dora把這兩個數字的和告訴了Ben
Dora問這兩數字是什麼?
Allen:我不知道這兩個數字什麼
Ben:我也還不知道這兩個數字是什麼
Allen:那我知道這兩個數字是什麼
Ben:喔 那我也知道了
邏輯想法:
1.從第一句Allen話中,可以推測出此兩個數字[a,b]所相乘[a*b]的答案中,只出現一次的可以先刪除
2.從第二句Ben話中,推測此兩個數字[a,b]所相加[a+b]的答案中,只出現一次的也可以刪除
3.第三句話,因為Allen聽到了Ben說的話,他從而知道答案,代表他所知道的乘積,在剩下來的選項中只有一組
4.類似上面的理由
pyton:
total=[]
for a in xrange(2,50):
for b in xrange(a+1,50):
total.append([a,b,a+b,a*b])#先將所有的可能性置入
mult=[]
for i in xrange(len(total)):
mult.append(total[i][3])#把其中 乘積的部份拿出來看
mult_s=set(mult)#列出乘積list中的所有元素
mult_p=[]
for i in mult_s:
if mult.count(i) == 1:
mult_p.append(i)
for i in reversed(xrange(len(total))):
if total[i][3] in mult_p:
del total[i]#將乘積中只有一組的剃除(邏輯1)
add=[]
for i in xrange(len(total)):
add.append(total[i][2])
add_s=set(add)
add_p=[]
for i in add_s:
if add.count(i) == 1:
add_p.append(i)
for i in reversed(xrange(len(total))):
if total[i][2] in add_p:
del total[i]#將剩下來的,把只有一組加的剃除(邏輯2)
mult2=[]
for i in xrange(len(total)):
mult2.append(total[i][3])
mult2_s=set(mult2)
answer_m=[]
for i in mult2_s:
if mult2.count(i)==1:
answer_m.append(i)#在做一遍找乘積只有一組的 但這次是留下(邏輯3)
for i in xrange(len(total)):
if total[i][3] in answer_m:
print total[i]
心得:
這作業一開使的邏輯推導很重要,利用多次的迴圈便可找出答案,其中我看了學長的寫法
深深感到自己寫程式不熟悉,導致很多可以簡略或替代的寫法,我都把他變得很複雜,這組
程式的前幾個版本,都因為自己寫的太複雜,Debug 搞到自己很煩
作者已經移除這則留言。
回覆刪除這是我以前寫的 給你參考
回覆刪除沒辦法縮排 只好加上底線 自己去掉吧
#列舉出所有
All_=_[]
for_i_in_xrange(2,49):
____for_j_in_xrange(i+1,50):
________All.append([i,j,i*j,i+j])
#第一步__拿出乘機中有重複的
Step_=_[]
for_i_in_All:
____have_=_0
____for_j_in_All:
________if_i[2]_==_j[2]:
____________have_+=_1
____if_have_>_1:
________Step.append(i)
All_=_Step
#第二步__拿出加法中有重複的
Step_=_[]
for_i_in_All:
____have_=_0
____for_j_in_All:
________if_i[3]_==_j[3]:
____________have_+=_1
____if_have_>_1:
________Step.append(i)
All_=_Step
#第三步__拿出乘機中只出現一次的
Step_=_[]
for_i_in_All:
____have_=_0
____for_j_in_All:
________if_i[2]_==_j[2]:
____________have_+=_1
____if_have_==_1:
________Step.append(i)
All_=_Step
#第四步__拿出加法中只出現一次的
Step_=_[]
for_i_in_All:
____have_=_0
____for_j_in_All:
________if_i[3]_==_j[3]:
____________have_+=_1
____if_have_==_1:
________Step.append(i)
All_=_Step
print_All