2009年4月16日 星期四

有兩個數字,分別大於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 搞到自己很煩

2 則留言:

  1. 作者已經移除這則留言。

    回覆刪除
  2. 這是我以前寫的 給你參考
    沒辦法縮排 只好加上底線 自己去掉吧

    #列舉出所有
    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

    回覆刪除