如何破解数字迷
怎么破解数字迷
破解
VINGT
CINQ
+ CINQ
TRENTE
规则:
1 不同的英文字母表示不同的数字
2 每一个数最左边不是0.
3 上面的题目是加,表示VINGT这个五位数与CINQ这个四位数的两倍相加后,回得到TRENTE这个六位数,并且数字的安排如谜语所表示。
能用递归做吗?
如果可以那怎么做?
------解决方案--------------------
那个算式是固定的吗?也就是说,是不是总是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)
下面的兄弟再想想
------解决方案--------------------
------解决方案--------------------
------解决方案--------------------
麻烦楼主再确认一下题目,我怎么觉得题目好像出错了似的,理由如下:
破解
VINGT
CINQ
+ CINQ
TRENTE
规则:
1 不同的英文字母表示不同的数字
2 每一个数最左边不是0.
3 上面的题目是加,表示VINGT这个五位数与CINQ这个四位数的两倍相加后,回得到TRENTE这个六位数,并且数字的安排如谜语所表示。
能用递归做吗?
如果可以那怎么做?
------解决方案--------------------
那个算式是固定的吗?也就是说,是不是总是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)
下面的兄弟再想想
------解决方案--------------------
------解决方案--------------------
------解决方案--------------------
麻烦楼主再确认一下题目,我怎么觉得题目好像出错了似的,理由如下:
- 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; }