洛谷P1013 [NOIP1998 提高组] 进制位

洛谷P1013 [NOIP1998 提高组] 进制位

第一次写注释(笑)

#include<bits/stdc++.h>
using namespace std;
int n,nn;
string a[15][15];
int b[15][15],c[15][15];
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++)
    cin>>a[i][j];                                    //输入 
    nn=n-1;						//进制的计算
	
	/*
	本题的计算中
	经推算 第二行输入中的字母数量即为进制数
	因为字母表示的是正整数
	如果n=5
	假设进制数为6
	那样就会出现这样的表格:
	+ 2 3 4 5
	2 4 5 10 11
	3 5 10 11 12
	4 10 11 12 13
	5 11 12 13 14
	其中0,1两个数字无法用字母表示
	如果出现这样的答案 会判定  “ERROR!”
	  
	*/
	
	
	 
    for(int i=2;i<=n;i++)
    {
    	for(int j=2;j<=n;j++)                  
    	if(a[i][j].length()==2) b[i][1]++;
		b[1][i]=c[1][i]=c[i][1]=b[i][1]; 
	} 
    /*for(int i=2;i<=n;i++)
    for(int j=2;j<=n;j++)
    if(a[i][j].length()==2) 
    {
    	b[1][j]++;
		c[1][j]++;
	}*/
	
	/*
	建立在第一段注释的基础上
	可以同样推断出 
	第一列 和 第一行 中的字母
	是由每一列或每一行中的两位数数量决定的 
	可以通过九九加法表推出	
	
	*/
	
	
	
    /*for(int i=2;i<=n;i++)
    {
    	if(b[i][1]!=b[1][i])
    	{
    		cout<<"ERROR!";
    		return 0;
		}
	}*/
	for(int i=2;i<=n;i++)
	{
		for(int j=2;j<=n;j++)
		{
			//cout<<a[i][j].length()<<" ";
			for(int z=0;z<=a[i][j].length()-1;z++)
			{	
			
				b[i][j]*=10;
				//cout<<a[i][j].substr(z,1)<<endl;
				for(int ii=2;ii<=n;ii++) if(a[ii][1]==a[i][j].substr(z,1)) b[i][j]+=b[ii][1];
			}
		}
		//cout<<endl;
	}
	//cout<<endl<<endl<<endl;
	
	
	
	
	
	for(int i=2;i<=n;i++)
	for(int j=2;j<=n;j++)
	{
		c[i][j]=c[i][1]+c[j][1];
		if(c[i][j]>nn-1)
		{
			c[i][j]+=10;
			c[i][j]-=nn;
		}
	}
	/*
	通过九九加法表计算出来的数值
	可以将整个加法表自己重新推算一遍
	再通过将加法表与输入进行对比
	判断ERROR 
	
	
	*/ 
	/*for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
	cout<<b[i][j]<<" ";
	cout<<endl;
	}
	cout<<endl<<endl;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
	cout<<c[i][j]<<" ";
	cout<<endl;
	}
	cout<<endl<<endl;*/
	for(int i=2;i<=n;i++)
	for(int j=2;j<=n;j++)
	if(b[i][j]!=c[i][j])
	{
		cout<<"ERROR!";
    	return 0;						//判断ERROR! 
	}
	for(int i=2;i<=n-1;i++)
	cout<<a[i][1]<<"="<<b[i][1]<<" ";
	cout<<a[n][1]<<"="<<b[n][1]<<endl;
	cout<<nn;
    return 0;
}
  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值