洛谷P1013 [NOIP1998 提高组] 进制位
2023-12-13 19:04:37
洛谷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;
}
文章来源:https://blog.csdn.net/zliang_ma/article/details/134978221
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!