怎么破解数字迷
破解
VINGT
CINQ
+ CINQ
TRENTE
规则:
1 不同的英文字母表示不同的数字
2 每一个数最左边不是0.
3 上面的题目是加,表示VINGT这个五位数与CINQ这个四位数的两倍相加后,回得到TRENTE这个六位数,并且数字的安排如谜语所表示。
能用递归做吗?
如果可以那怎么做?
[解决办法]
那个算式是固定的吗?也就是说,是不是总是A+B+B=C?
如果式子固定,那么也不难求。只需要不断为每个字母枚举不同数字,然后递归,如果到了某一步,发现下一步无法再进行,那么就回溯修改一下数字,再递归。
[解决办法]
每个字母代表一个数字,将数字代入到式子中,使表达式成立即可,是这个意思吧。
[解决办法]
VINGT CINQ CINQ-------TRENTEV != 0C != 0T != 0Q != 0N != 0I != 0(T + Q + Q)%10 = E;T = 1 VING1 CINQ CINQ-------1REN1EGRE三者中可能存在0G != 0, 因为如果G=0,(N + N)%10 = 1就不可能成立。RE两者中可能存在0E != 0, 因为如果E=0,(1 + Q + Q)%10 = E就不可能成立。所以R=0到目前位置得到:R = 0T = 1 VING1 CINQ CINQ-------10EN1E(N + I + I)%10 = N所以I = 5到目前为止得到:R = 0T = 1I = 5 V5NG1 C5NQ C5NQ-------10EN1EV => 8V + 进位 = 10,而进位<=2E肯定是奇数(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
满足条件就求出解了啊 啊~~~
[解决办法]
/* 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位数首位是1R = 0; //I+C+C的进位至多是2,V至多是9,因此R是0或1。1已用,R是0V = 8/9;//这个判断条件在代码中没有用到。 I+C+C的进位至多是2,所以V至少是8I = 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;}
[解决办法]
忘记说了,结果是这个
/* 8 4 6 8 1 9 4 6 6 + 9 4 6 6 -------------- 1 0 3 6 1 3 */
[解决办法]
94851
6483
6483
------
107817
[解决办法]
16楼代码修改
bool TryNum(int num[], int index){ int i = 0; for (i=0; i<10; i++) { if (!g_used[i]) { num[index] = i; g_used[i] = true; if (index < 6) { if (TryNum(num, index+1)) return true; } else { if (JudgeResult(num)) return true; } g_used[i] = false; } } return false;}/* 9 4 8 5 1 6 4 8 3 + 6 4 8 3 -------------- 1 0 7 8 1 7 */
[解决办法]
VINGT CINQ CINQ-------TRENTEStep 1:V != 0C != 0T != 0Q != 0N != 0I != 0T = 1-------Step 2: VING1 CINQ CINQ-------1REN1E(1 + 2Q)%10 = E (a)E must be odd -> E = ?(3, 5, 7, 9) (b) if E = 3 => Q = 1 X, becasue T = 1 if E = 5 => Q = 2, 7 if E = 7 => Q = 3, 8 (b1) if E = 9 => Q = 4(G + 2N)%10 = 1 -> G maybe odd(G + 2N + 1)%10 = 1 -> G maybe even(N + 2I)%10 = N -> I = 5 (c)(N + 2I + 1)%10 = N -> should not exist(N + 2I + 2)%10 = N -> I = 4(I + 2C)%10 = E -> I maybe odd(I + 2C + 1)%10 = E -> I maybe even V = ?(8, 9)R <= 1 -> R = 0 (d)------------------------Step 3: VING1 CINQ CINQ-------10EN1ESo V = 9, because (I + 2C + carry) < 20Step 4: 9ING1 CINQ CINQ-------10EN1E(b) refined to: E = ?(5, 7) (e)N + 2I carries, and the carry must be 1, becuase I = 4 or 5, and N >= 2 (0 and 1 is occupied by R and T respectively)(I + 2C)%10 = E -> I maybe odd so, wrong here(I + 2C + 1)%10 = E -> I maybe even => I = 4 (f)Step 5: 94NG1 C4NQ C4NQ-------10EN1E(f) refined to: (5 + 2C)%10 = E?(5, 7) (g)if E = 5 => C = 5, wrong, because E != C,So, E = 7 (h)Step 6: 94NG1 C4NQ C4NQ-------107N17(N + 8 + carry)%10 = N -> carry = 2, that meansG + 2N >= 20 orG + 2N + carry' >= 20according (b1), Q = ?(3, 8), (i)so, 1 + 2Q < 20, that means carry' <= 110 <N + 4 + 4 + carry < 20So, 4 + 2C + 1(carry) = 17 => C = 6--------------------------------Step 6: 94NG1 64NQ 64NQ-------107N17 according (i), given Q = 3 => G + 2N = 21 => (N = 8, G = 5) 94851 6483 6483-------107817 ...found....
[解决办法]