洛谷 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

思路

我还不清楚,这么一道模拟题怎么就变成了:
洛谷P1013
首先,肯定有进位,不然可以不停的加出新的数出来而无法表示。

既然有进位,进制至多是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;
}

谢谢--zhengjun

posted @ 2022-06-10 18:30  A_zjzj  阅读(55)  评论(0编辑  收藏  举报