题目描述
著名科学家卢斯为了检查学生对进位制的理解,他给出了如下的一张加法表,表中的字母代表数字。 例如:
+ L K V E
L L K V E
K K V E KL
V V E KL KK
E E KL KK KV
其含义为:
L + L = L L+L=L L+L=L, L + K = K L+K=K L+K=K, L + V = V L+V=V L+V=V, L + E = E L+E=E L+E=E
K + L = K K+L=K K+L=K, K + K = V K+K=V K+K=V, K + V = E K+V=E K+V=E, K + E = K L K+E=KL K+E=KL
… … E + E = K V …… E+E=KV ……E+E=KV
根据这些规则可推导出: L = 0 , K = 1 , V = 2 , E = 3 L=0,K=1,V=2,E=3 L=0,K=1,V=2,E=3
同时可以确定该表表示的是4进制加法
//感谢 lxylxy123456 同学为本题新加一组数据
输入格式
n n n ( n ≤ 9 ) (n≤9) (n≤9)表示行数。
以下
n
n
n行,每行包括
n
n
n个字符串,每个字串间用空格隔开。(字串仅有一个为+
号,其它都由大写字母组成)
输出格式
① 各个字母表示什么数,格式如: L = 0 L=0 L=0, K = 1 K=1 K=1, … … …… ……按给出的字母顺序。
② 加法运算是几进制的。
③ 若不可能组成加法表,则应输出ERROR!
输入输出样例
输入 #1
5
+ L K V E
L L K V E
K K V E KL
V V E KL KK
E E KL KK KV
输出 #1
L=0 K=1 V=2 E=3
4
思路
我还不清楚,这么一道模拟题怎么就变成了:
首先,肯定有进位,不然可以不停的加出新的数出来而无法表示。
既然有进位,进制至多是n-1进制的
否则
1
+
n
−
2
=
n
−
1
1+n-2=n-1
1+n−2=n−1,无法进位,但是肯定没有
n
−
1
n-1
n−1这个数,
0
∽
n
−
1
0\backsim n -1
0∽n−1就有
n
n
n个了,至多有
n
−
1
n-1
n−1个数
那么:
x
=
(
x
−
1
)
+
1
=
(
x
−
2
)
+
2
=
.
.
.
.
.
.
=
1
+
(
x
−
1
)
x=(x-1)+1=(x-2)+2=......=1+(x-1)
x=(x−1)+1=(x−2)+2=......=1+(x−1)
所以,一个数
x
x
x 就会在表格中出现
(
x
−
1
)
(x-1)
(x−1)次
( x < n − 1 (x<n-1 (x<n−1即没有进位 ) ) )
只要用 m a p map map做就够了。(说是 m a p map map,其实只是一个数组充当 m a p map map而已)
判断是否合法时,两重枚举两个数,用进制转换法将结果转换为十进制,在判断是否等于前两个数的和。
上代码
#include<bits/stdc++.h>
using namespace std;
char str[10][10][5];
int n,f[300];//f为map
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%s",str[i][j]);
for(int i=2;i<=n;i++)
for(int j=2;j<=n;j++)
if(strlen(str[i][j])==1)
f[str[i][j][0]]++;
for(int i=2;i<=n;i++){
for(int j=2;j<=n;j++){
int x=f[str[i][1][0]]-1,y=f[str[1][j][0]]-1;
int sum=0,t;
for(int k=0;k<strlen(str[i][j]);k++){
t=f[str[i][j][k]]-1;
sum=sum*(n-1)+t;//进制转换
}
if(x+y!=sum){//不合法
printf("ERROR!");
return 0;
}
}
}
for(int i=2;i<=n;i++){
printf("%c=%d ",str[1][i][0],f[str[1][i][0]]-1);//空格忘记加了搞了好久(我直接在网站里打代码,不编译)
}
printf("\n%d",n-1);
return 0;
}