一個蠻有趣的討論題,這篇可以提供一下學校作業解題的思考方向,可以使用從頭到尾運行一遍,取出答案。或是由數學公式直接取得答案。
題目: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 . $j, 3)) == 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 . $i, 3)) == 7) { // ABCDEFG
echo $check." x ". $j ." = ". $answer ."\r\n";
}
}
}
}
}
?>
沒有留言:
張貼留言
我的意見