如何破解数字迷

怎么破解数字迷
破解
  VINGT
  CINQ
  + CINQ
  TRENTE
规则:
1 不同的英文字母表示不同的数字
2 每一个数最左边不是0.
3 上面的题目是加,表示VINGT这个五位数与CINQ这个四位数的两倍相加后,回得到TRENTE这个六位数,并且数字的安排如谜语所表示。

能用递归做吗?
如果可以那怎么做?

------解决方案--------------------
那个算式是固定的吗?也就是说,是不是总是A+B+B=C?

如果式子固定,那么也不难求。只需要不断为每个字母枚举不同数字,然后递归,如果到了某一步,发现下一步无法再进行,那么就回溯修改一下数字,再递归。
------解决方案--------------------
每个字母代表一个数字,将数字代入到式子中,使表达式成立即可,是这个意思吧。
------解决方案--------------------
探讨
那个算式是固定的吗?也就是说,是不是总是A+B+B=C?

如果式子固定,那么也不难求。只需要不断为每个字母枚举不同数字,然后递归,如果到了某一步,发现下一步无法再进行,那么就回溯修改一下数字,再递归。

------解决方案--------------------
目前相到的:
 VINGT
CINQ
CINQ
-------
TRENTE

V != 0
C != 0
T != 0
Q != 0
N != 0
I != 0

(T + Q + Q)%10 = E;

T = 1(I + C + C + 百分位的进位,所得到的进位不可能超过9,V也不可能超过9)

下面的兄弟再想想
------解决方案--------------------
探讨
引用:
1.具体哪个字母代表哪个数字
因为数字只有10个(0~9),字母有26个,那剩下的16字母做什么?
具体的匹配原则是什么?


楼主给出的式子中没有出现所有的字母,只有下面10个字母:
VINGTCQTRE

------解决方案--------------------
探讨
引用:
引用:
1.具体哪个字母代表哪个数字
因为数字只有10个(0~9),字母有26个,那剩下的16字母做什么?
具体的匹配原则是什么?


楼主给出的式子中没有出现所有的字母,只有下面10个字母:
VINGTCQTRE


9个。。。

------解决方案--------------------
麻烦楼主再确认一下题目,我怎么觉得题目好像出错了似的,理由如下:
C/C++ code

 VINGT
  CINQ
  CINQ
-------
TRENTE

V != 0
C != 0
T != 0
Q != 0
N != 0
I != 0

(T + Q + Q)%10 = E;
T = 1

 VING1
  CINQ
  CINQ
-------
1REN1E

GRE三者中可能存在0
G != 0, 因为如果G=0,(N + N)%10 = 1就不可能成立。

RE两者中可能存在0
E != 0, 因为如果E=0,(1 + Q + Q)%10 = E就不可能成立。

所以R=0

到目前位置得到:
R = 0
T = 1

 VING1
  CINQ
  CINQ
-------
10EN1E

(N + I + I)%10 = N
所以I = 5

到目前为止得到:
R = 0
T = 1
I = 5

 V5NG1
  C5NQ
  C5NQ
-------
10EN1E

V => 8
V + 进位 = 10,而进位<=2

E肯定是奇数(3, 7, 9中的一个) 因为 (1 + Q + Q)%10 = E  
G肯定是奇数(3, 7, 9中的一个)

(1 + 2Q)%10 = (5 + 2C)%10

(6 + 2C)%10 = E
(6 + 2C)肯定是偶数,而E是奇数,这个矛盾

------解决方案--------------------
各位兄弟帮忙看看,或许上面的推导什么地方有问题?
------解决方案--------------------
为什么R就一定得是0?
........................
GRE三者中可能存在0
G != 0, 因为如果G=0,(N + N)%10 = 1就不可能成立。

RE两者中可能存在0
E != 0, 因为如果E=0,(1 + Q + Q)%10 = E就不可能成立。

所以R=0

------解决方案--------------------
int V,I,N,G,T,C,Q,R,E;
9个for循环取0~9的不同数字
判断VINGT + CINQ == TRENTE
满足条件就求出解了啊 啊~~~
------解决方案--------------------
C/C++ code

/*
    V I N G T 
      C I N Q 
+     C I N Q 
--------------
  T R E N T E 

T = 1; //5为数加一个5位数(或更小的数)的和是6位数,很容易判断6位数首位是1
R = 0; //I+C+C的进位至多是2,V至多是9,因此R是0或1。1已用,R是0
V = 8/9;//这个判断条件在代码中没有用到。 I+C+C的进位至多是2,所以V至少是8
I = 4/9;//这个判断条件在代码中没有用到.  百位 (N+I+I+进位)%10 = N, I只可能是4、5、9。再看十位G+N+N结果十位是1,一次十位一定有进位,故I不可能是5


    V I N G 1 
      C I N Q 
+     C I N Q 
--------------
  1 0 E N 1 E 
*/

//g_used[i] == false 代表数组中还没用i这个数字
bool g_used[10] = {true, true, false, false, false, false, false, false, false, false};

bool TryNum(int num[], int index);
void fun()
{
    int num[7];//V, I, N, G, C, Q, E;
    if (TryNum(num, 0))
    {
        printf("\n");
        printf("    %d %d %d %d 1 \n", num[0], num[1], num[2], num[3]);
        printf("      %d %d %d %d \n", num[4], num[1], num[2], num[5]);
        printf("+     %d %d %d %d \n", num[4], num[1], num[2], num[5]);
        printf("--------------\n");
        printf("  1 0 %d %d 1 %d \n", num[6], num[2], num[6]);
    }
}
bool JudgeResult(const int num[])
{
    int num1, num2, num3;
    num1 = num[0] * 10000 + num[1] * 1000 + num[2] * 100 + num[3] * 10 + 1;
    num2 = num[4] * 1000 + num[1] * 100 + num[2] * 10 + num[5];
    num3 = 100010 + num[6] * 1001 + num[2] * 100;
    return num3 == num1 + num2 * 2;
}
bool TryNum(int num[], int index)
{
    int i = 0;
    for (i=0; i<10; i++)
    {
        if (!g_used[i])
        {
            num[index] = i;
            if (index < 6)
            {
                if (TryNum(num, index+1))
                    return true;
            }
            else
            {
                if (JudgeResult(num))
                    return true;
            }
        }
    }
    return false;
}