天天看點

0~9十個數,每個數隻能使用一次,組成兩個三位數相加和為四位數的算法

  這幾天上網,看到百度裡面有人問這一道題目,0~9十個數,組成如下加法式 *** + *** = ****,每個數字都隻能使用一次,問一共多少中組合?

今天,就用C#語言來寫一下,解出這道題,其他語言算法相同,隻是文法不同,這裡由于時間關系,不再貼出代碼。

  針對大家提出的優化建議,已經将優化方案寫出,下面是具體優化方案:

  這裡先講解一下思路,首先我們是程式員,不是數學家,我們是站在程式設計的角度思考問題。這裡是兩個三位數相加,得到一個四位數,所有數字不能重複,最大的和應該為987 + 654 = 1641,就是說兩個三位數相加的結果不會超過2000.那麼1一定在後面的四位數中, 那麼最小的三位數是203,最大的三位數是987,确定循環的範圍,當然你非要用100到999也可以,不過就是效率低一些罷了。

  通過循環,得到兩個三位數後,然後就是将兩個數相加,得到他們的和,驗證和是否為四位數、是否重複使用了數字。當然這兩個可以放到一起驗證,我的思路是,将兩個三位數和他們的和,拼成一個字元串,然後判斷0~9哪個數字不存在字元串中,隻要有一個不存在,就不符合條件,隻有0~9都存在,才是正确結果。

  下面用代碼來實作一下,打開VS2010,建立一個控制台程式,打開Program.cs開始編寫代碼,全部代碼如下:

  

這裡寫了一個PrintNum類,将方法封裝到類裡面,然後在main方法中執行個體化該類,調用方法輸出結果。結果如下:

0~9十個數,每個數隻能使用一次,組成兩個三位數相加和為四位數的算法

這是正常寫法,代碼沒有經過優化,看到執行這個過程一共消耗了474ms.下面是經過優化的代碼:

執行結果如圖:

0~9十個數,每個數隻能使用一次,組成兩個三位數相加和為四位數的算法

執行共耗時315ms,一下減少了100多毫秒,當然我的電腦性能好,在性能差一點的電腦上面,差别就不是這麼多了。優化的思路是,内循環從大到小,當兩個數相加小于1000及不是四位數時,退出本次循環。就是減少了循環次數。

是的,你沒看錯,前面的是序号,一共96個結果。說實話,我也沒想到會有這麼多。。。

繼續閱讀