解字母加法謎題:不同漢字代表不同數字 (0-9),同字同數。算式:
學 C
要 學 C
+ 都 要 學 C
-----------
2 0 0 8
即:學C + 要學C + 都要學C = 2008。核心考點:四重循環窮舉、約束剪枝、字母數字映射。
設:
都 = a (千位,≠0)要 = b (百位,≠0)學 = c (十位,≠0)C = d (個位)三數為:
方程:(10c+d) + (100b+10c+d) + (1000a+100b+10c+d) = 2008
化簡:1000a + 200b + 30c + 3d = 2008
for (a=1; a<3; a++) // a≠0, 且 1000a≤2008 → a∈{1,2}
for (b=1; b<10; b++) // b≠0
if (a!=b)
for (c=1; c<10; c++) // c≠0
if (c!=a && c!=b)
for (d=0; d<10; d++)
if (d!=a && d!=b && d!=c)
if (n+m+l == 2008) 找到解
由 1000a + 200b + 30c + 3d = 2008:
a ∈ {1,2} (a=2 時 2000+...>2008 無解) → **a=1 確定**200b + 30c + 3d = 1008b ≤ 5 (200×5=1000),且 b≠1 → **b ∈ {2,3,4,5}**30c + 3d = 1008 - 200b,右邊必須能被 3 整除 → 1008-200b ≡ 0 (mod 3)30c + 3d = 408 → 10c + d = 136**結論:原題無解**,或題目條件有誤 (如進制非 10、或算式對齊不同)。
int main() {
int found = 0;
for (int a=1; a<=2; a++)
for (int b=1; b<=9; b++) if (b!=a)
for (int c=1; c<=9; c++) if (c!=a && c!=b)
for (int d=0; d<=9; d++) if (d!=a && d!=b && d!=c) {
int n = 10*c + d;
int m = 100*b + 10*c + d;
int l = 1000*a + 100*b + 10*c + d;
if (n + m + l == 2008) {
printf("解: 都=%d 要=%d 學=%d C=%d\n", a,b,c,d);
found = 1;
}
}
if (!found) printf("無解\n");
return 0;
}
運行結果:**無解**。
若算式對齊為右對齊 (個位對齊):
學 C
要 學 C
都 要 學 C
---------
2 0 0 8
即:學C + 要學C + 都要學C = 2008 (同原建模),無解。
若為:學 + 要學 + 都要學 = 2008 (無 C) → 另謎題。
若結果非 2008 而是其他數 → 可能有解。
字母謎題展示了建模 → 代數剪枝 → 窮舉驗證的完整流程。關鍵收穫:
printf("都=%d 要=%d 學=%d C=%d\n", ...) 清晰呈現映射。