星期一, 1月 11, 2010

6個G

原始討論:http://twpug.net/modules/newbb/viewtopic.php?topic_id=4828&forum=16

一個蠻有趣的討論題,這篇可以提供一下學校作業解題的思考方向,可以使用從頭到尾運行一遍,取出答案。或是由數學公式直接取得答案。

題目:6個G


在下列乘法算式中,每個字母代表0~9的一個數字,且不同的字母代表不同的數字:

  ABCDE

X     F

-------

 GGGGGG

求出各字母對應之數字。

有印象中,有一題最基本題, 1+2+3+.....+1000 這道題嗎?你可以跑回圈計算總合


for ($i 1$i <= 1000$i++) $sum += $i;
echo 
$sum;


或是直接用公式 (n * (n +1)) / 2 算出答案
echo (1000 * (1000 1)) / 2;

那麼其實由程式執行效率,後者會較優,但是前者也不一定不好,因為那是最基礎的做法。所以寫程式務必了解各種解法的可能,取得以結果為導向的最佳解法。

接下來進入主題的程式碼,第一個方式程式是按步就班的計算,並找出答案。
依照題目定義,5個數字乘以1個數字得到一個6位數,而這6位數的數字是相同的。

<?php
for ($i 10000$i <= 99999$i++) {
    for (
$j 1$j <=9$j++) {
        
$number $i $j;
        if (
strlen(count_chars(strval($number), 3)) == 1) { // 結果為相同數字
            
if (strlen(strval($number)) == 6) { // 結果為六位數
                
if (strlen(count_chars(strval($number) . $i $j3)) == 7) { // 七個數字都不同
                      
echo $i ." x "$j " = ".$number."\r\n";
                }
            }
        }
    }
}
?>


那麼按步來就是 10000 到 99999 的數字 乘以 1-9, 所以寫了雙迴圈。
step 1.判斷結果 $number 這個數字是否為相同的數字(111111,22222....999999),使用 count_chars
函式可以找出字元的重複數。
setp 2.判斷 $number 是否為6位數
setp 3.判斷乘數和被乘數以及答案是否為不同數字(ABCDE * F = GGGGGG) 理論上剛好7種字元。

所以執行結果 95238 x 7 = 666666

另外一種就是由結果反推計算(PIGO提供): ABCDE * F = GGGGGG
那麼 ABCDE = GGGGGG  / F

也就是直接找出 111111,222222,.....999999 這九組數據中 除以 1-9 的1個數字 會得到一個5位數。迴圈只有 9x9 次的檢查。


<?php
for ($i 1$i 10 $i++) {
    
$answer $i 111111;
    for (
$j 1$j 10$j++) {
        if(
$answer $j == 0) {
            
$check $answer $j;
            if (
strlen(strval($check)) == 5) { // ABCDE
                
if (strlen(count_chars(strval($check) . $j $i3)) == 7) { // ABCDEFG
                        
echo $check." x "$j ." = "$answer ."\r\n";
                }
            }
        }
    }
}
?>


沒有留言:

張貼留言

我的意見