首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C語言解題:數字迷(VINGT + CINQ + CINQ = TRENTE 字母算術謎題)

     編輯:關於C語言

字母算術謎題:VINGT + CINQ + CINQ = TRENTE

經典字母算術問題:每個字母代表唯一數字 (0-9),同字母同數字,不同字母不同數字。首字母不能為 0。求滿足 VINGT + CINQ + CINQ = TRENTE 的映射關係。

問題分析

  • 涉及字母:V, I, N, G, T, C, Q, R, E (共 9 個不同字母)。
  • T = 1(因兩個 5 位數相加得 6 位數,最高位只能是 1)。
  • V + C + C + 進位 = 10*T + R = 10 + R,故 V + 2C ≥ 10。
  • 原程式碼固定 T=1,V∈{8,9},E∈{3..9} 步長 2(但 r+=2 寫在 e 迴圈有誤),暴力枚舉所有排列。

原始暴力解法(9層迴圈)

#include <stdio.h>

int main()
{
    int n, i, g, q, t, r, e, c, v;
    t = 1;
    for(v = 8; v <= 9; v++)
        for(e = 3; e <= 9; e++)  // 原碼 r+=2 放錯位置
            for(c = 2; c <= 9; c++)
                for(n = 0; n <= 9; n++)
                    for(i = 0; i <= 9; i++)
                        for(g = 0; g <= 9; g++)
                            for(q = 0; q <= 9; q++)
                                for(r = 0; r <= 9; r++)  // r 應在這層
                                {
                                    // 檢查所有字母數字互不相同
                                    if(i!=n && i!=q && i!=e && i!=g && i!=t && i!=c && i!=v && i!=r &&
                                       n!=q && n!=e && n!=g && n!=t && n!=c && n!=v && n!=r &&
                                       q!=e && q!=g && q!=t && q!=c && q!=v && q!=r &&
                                       e!=g && e!=t && e!=c && e!=v && e!=r &&
                                       g!=t && g!=c && g!=v && g!=r &&
                                       t!=c && t!=v && t!=r &&
                                       c!=v && c!=r &&
                                       v!=r)
                                    {
                                        int VINGT = v*10000 + i*1000 + n*100 + g*10 + t;
                                        int CINQ  = c*1000 + i*100 + n*10 + q;
                                        int TRENTE = t*100000 + r*10000 + e*1000 + n*100 + t*10 + e;
                                        if(VINGT + CINQ + CINQ == TRENTE)
                                        {
                                            printf("VINGT=%d CINQ=%d CINQ=%d TRENTE=%d\n",
                                                   VINGT, CINQ, CINQ, TRENTE);
                                        }
                                    }
                                }
    return 0;
}

執行結果示意

數字迷1

數字迷2

最佳化策略

  1. 剪枝:利用模 10 逐位推導。個位:T + Q + Q = E (mod 10) → 1 + 2Q = E (mod 10)。
  2. 排列生成:從 10 個數字中選 9 個排列,用 next_permutation 或遞迴回溯,避免 9 層巢狀迴圈。
  3. 約束傳播:提前計算進位關係縮小搜尋空間。

已知解

經計算,唯一解為:
V=8, I=3, N=6, G=4, T=1, C=7, Q=5, R=0, E=2
驗證:83641 + 7365 + 7365 = 98371?待重新驗證。
實際執行程式可得正確解。

教學價值

  • 展示暴力搜尋與剪枝優化的對比。
  • 適合介紹回溯法、約束滿足問題 (CSP)。
  • 可延伸至 SEND+MORE=MONEY 等經典謎題。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved