c语言,编程求助,算术题

来源:百度知道 编辑:UC知道 时间:2024/06/03 05:29:52
VINGT+CINQ+CINQ=TRENTE

算出各个字母代表的值,不要那种原始的每个字母++的for循环,那个要计算10^9次......机子都算烂
cinq的2倍并不一定还是4位数呃,所以不要把两个cinq写成一个

一个较系统的方法是:
每个字母设置两种状态,已知和未知。
进行回朔搜索。从个位搜索起,等式左边的T,Q先进行0-9的搜索,且将T,Q的状态设置成已知。这时搜索E的值,可以很快得到结果,也将其设置成已知。然后搜索十位,此时T的值已知,搜索未知的字母,另G+N+N=T为进行下一层搜索的条件(如果个位有进位,等式左边要加1),把矛盾的情况排除。以此类推,搜索百位,千位,由于有回朔,所以搜索的速度会快很多。这是一个DFS。
闲着无聊,写了一下程序。结果按vingtcqre的顺序为999219919。

#include <stdio.h>
#include <string.h>

int f[6][9];//存储原等式
int r[9];//结果
char k[9];//Known?

int find(int level, int j, int c/*进位*/)
{
if(level == 6)
return 1;
if(j == 9)
{
int t=c;
for(int i = 0; i < 9; ++i)
t += r[i] * f[level][i];
if(t % 10 != 0)
return 0;
return find(level + 1, 0, t / 10);
}
if(!k[j] && f[level][j])
{
k[j] = 1;
for(int i = 9; i>= 0; --i)
{
r[j] = i;
if(find(level, j+1, c))
return 1;
}
k[j] = 0;
return 0;
}
else
{
return find(level, j+1, c);
}
}