洛谷 P1013进制位题解--zhengjun
题目描述
著名科学家卢斯为了检查学生对进位制的理解,他给出了如下的一张加法表,表中的字母代表数字。 例如:
+ 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+K=K\),\(L+V=V\),\(L+E=E\)
\(K+L=K\),\(K+K=V\),\(K+V=E\),\(K+E=KL\)
\(…… E+E=KV\)
根据这些规则可推导出:\(L=0,K=1,V=2,E=3\)
同时可以确定该表表示的是4进制加法
//感谢 lxylxy123456 同学为本题新加一组数据
输入格式
\(n\) \((n≤9)\)表示行数。
以下\(n\)行,每行包括\(n\)个字符串,每个字串间用空格隔开。(字串仅有一个为+
号,其它都由大写字母组成)
输出格式
① 各个字母表示什么数,格式如:\(L=0\),\(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\),无法进位,但是肯定没有\(n-1\)这个数,\(0\backsim n -1\)就有\(n\)个了,至多有 \(n-1\)个数
那么:
\(x=(x-1)+1=(x-2)+2=......=1+(x-1)\)
所以,一个数 \(x\) 就会在表格中出现\((x-1)\)次
\((x<n-1\)即没有进位\()\)
只要用\(map\)做就够了。(说是\(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;
}