NOIP1998提高组 进制位

2 篇文章 0 订阅

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=3
    4

解题分析:

    在洛谷上(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!"< 
           
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值