NOIP1998提高组 进制位
题目描述
著名科学家卢斯为了检查学生对进位制的理解,他给出了如下的一张加法表,表中的字母代表数字。 例如:+ 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进制加法
输入输出格式
输入格式:
n(n≤9)表示行数。以下n行,每行包括n个字符串,每个字串间用空格隔开。(字串仅有一个为‘+’号,其它都由大写字母组成)
输出格式:
① 各个字母表示什么数,格式如:L=0,K=1,……按给出的字母顺序。② 加法运算是几进制的。
③ 若不可能组成加法表,则应输出“ERROR!”
输入输出样例
输入样例:
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
输出样例:
L=0 K=1 V=2 E=34
解题分析:
在洛谷上(NOIP竞赛的官方数据)的数据的特点:1、如果是合法的,则为n-1进制
2、每行的第一个元素或第一列的元素(除+外)都为一个字母,表示n-1进制的且小于n-1的数。
确定各个进制数的方法:从第二行开始,每行从第二个元素开始长度为2的个数w[i],如果为0,则表示该行的第一个元素代表0,如果为1,则表示该行的第一个元素代表1,......。
不合法的判断:
1、如果对于i, j, i<>j,且w[i]=w[j],则不合法。
2、对每一个相加的结果进行判断,如果与预期的结果不等,则不合法。判断方法是:将每个元素所在的的行首和列首所对应的元素相加(转化为10进制),然后在将相加的结果转化为字母表示,如果相等,则合法,否则不合法。
#include
#include
#include
#include
using namespace std;
string plus1[10][10];
int w[10] = {0};
int n;
int find(string ch){
int i;
for(i=1; i
>n; for(i=0; i
>plus1[i][j]; for(i=1; i
1) w[i]++; } for(i=1; i
=n-1) str += find((i1 + i2) / (n-1)); str += find((i1 + i2)%(n-1)); if(str!=plus1[i][j]){ cout<<"ERROR!"<