69,382
社区成员
发帖
与我相关
我的任务
分享
94851
6483
6483
-------
107817
VINGT
CINQ
CINQ
-------
TRENTE
Step 1:
V != 0
C != 0
T != 0
Q != 0
N != 0
I != 0
T = 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
-------
10EN1E
So V = 9, because (I + 2C + carry) < 20
Step 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 means
G + 2N >= 20 or
G + 2N + carry' >= 20
according (b1), Q = ?(3, 8), (i)
so, 1 + 2Q < 20, that means carry' <= 1
10 <N + 4 + 4 + carry < 20
So,
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....
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
*/
/*
8 4 6 8 1
9 4 6 6
+ 9 4 6 6
--------------
1 0 3 6 1 3
*/
/*
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;
}