## 【32】Pandigital products泛位數的乘積 若一個n位元數包含了數字1到n且各僅一次話,就稱之為「Pandigital products」。例如,5位數15234是一個包含1到5各一次,是泛位數的。 7254是一個不同尋常的積,因為39 × 186 = 7254,其中,被乘數丶乘數和積,是泛位數的,包含了數位1到9。 請找出像上面的7254那樣能表示成泛位數的乘積等式的所有積的和。 提示:有些數字能表示成多種乘積的形式,小心不要重複累加。 #### 分析:二位數乘二位數最多得到四位數,而三位數乘三位數最少得到五位數,這都排除形成1到9的Pandigital products,那麼2位數乘3位數最有可能,先處理完,最後再來探討1位數乘4位數得到4位數的可能情形。 ### 第1個想法:迴圈產生axb=c ![](https://i.imgur.com/SXJKqkx.png) 為何是123? #這樣a需要避開22,33,44...,b需要避開133,144,...,229,…,535,....太多了 ### 第2個想法:假設a1a2xb1b2b3=c,主動避開a1,a2,b1,b2,b3相同數字 ![](https://i.imgur.com/UsqS9YM.png) #這樣產生a1,a2,b1,b2,b3五數確實倆倆不同,但是……   ### 第3個想法:那就先跑完迴圈再把條件不合的剔除 ![](https://i.imgur.com/cpbeJMg.png) #剩下問題就是怎摸剔除不要的結果。 ### 練習1:判斷某一個指定元素是否在集合中,如果有,將此元素移除。 ![](https://i.imgur.com/xJi9YK9.png) ### 第4個想法:能不能用縮減的方法來處理問題,先設一個串列[1,2,3,4,5,6,7,8,9],在迴圈中逐次用掉,類似下面程式 ![](https://i.imgur.com/QElNn94.png) 一個簡單的實驗: ![](https://i.imgur.com/tQ2w31Q.png) 會出現TypeError: 'NoneType' object is not iterable。看來這種想法不行! 經過上面4種方法討論,我們採取第3種方法,也許同學還可以自己找到更好的方法! ### 練習2:寫一個函式將一個四位數c,切開成C1 C2 C3 C4, 例如c=7254切成C1=7,C2=2,C3=5,C4=4 ![](https://i.imgur.com/LXqwPsz.png) <--有錯,不要照抄喔 ### 練習3:引用operator套件,使用operator.eq比較兩個串列是否相等。 ![](https://i.imgur.com/yblA82n.png) #配合sorted,可以先排序在比對。 ### 練習4:指令len(L)可以求出L的長度,假設L=[111,222,444,555],利用append加入新的元素請判斷333和444,如果已經在L中重複,就不要加入,最後求出L內所有元素合。 ![](https://i.imgur.com/MAOLzMO.png) 計算總合有2種方法: ![](https://i.imgur.com/MuAeEtp.png) 練習1中用了list刪除元素的方法L.remove(),你可以先假設一個L1=[1,2,3,4,5,6,7,8,9],然後逐次將a1,a2,b1,b2,b3刪除,剩下4個元素和L2=[C1,C2,C3,C4]作比對,記得要先用練習3的方法排序過,也可以L1和[a1,a2,b1,b2,b3,C1,C2,C3,C4]直接比對喔。 練習2函式中,如果增加一個傳回值,當裡面C1 C2 C3 C4的4個值都不相同則傳回True,會有利於最後的整合喔!練習4:算出來的c值,有很多個,可能有重複的,直接加總的話,重複了也不知道,假設用list收集,可用not in指令來判斷是否重複了,就是練習4喔。 ## 請找出像上面的7254那樣能表示成泛位數的乘積等式的所有積的和。