P1013 [NOIP1998 提高组] 进制位
作者:互联网
题意很不明晰,我就随便糊上去了。
在结果中出现的字母肯定得在加数中出现。因为不存在 \(1\) 进制,所以不妨假设题目的意思是一定有大于 \(0\) 的数出现,而正整数自己与自己相加肯定能得到更大的数,如此反复,一定会产生进位。
而加数均是一位的,所以进位后只可能有两位数并且高位一定是 \(1\)。
\(1+1=2\),\(1+2=3\),\(1+3=4\)……如此下去所有一位数都会在加数中出现,那么这就是一张非常正经的加法表了。
口胡完毕,接着来看怎么算。发现和中的两位数个数就是数值,最后判一下合法性就完了。
code:
#include<bits/stdc++.h>
using namespace std;
#define N 10
#define For(i,x,y)for(i=x;i<=(y);i++)
int val[256],n;
char x[N],y[N];
string num[N][N];
bool pd(int i,int j)
{
if(val[x[i]]+val[y[j]]<n-1)if(num[i][j].size()==2||val[x[i]]+val[y[j]]!=val[num[i][j][0]])return 0;
else return 1;
return val[num[i][j][0]]==1&&val[x[i]]+val[y[j]]-(n-1)==val[num[i][j][1]];
}
int main()
{
int i,j;
cin>>n>>x[0];
For(i,0,n-2)cin>>x[i];
For(i,0,n-2)
{
cin>>y[i];
For(j,0,n-2)cin>>num[i][j];
}
For(i,0,n-2)
For(j,0,n-2)val[x[i]]+=num[i][j].size()==2;
For(i,0,n-2)
For(j,0,n-2)
if(!pd(i,j))puts("ERROR!"),exit(0);
For(i,0,n-2)cout<<x[i]<<'='<<val[x[i]]<<' ';
cout<<endl<<n-1;
return 0;
}
标签:进制,cin,P1013,加数,num,NOIP1998,进位,define 来源: https://www.cnblogs.com/May-2nd/p/14733361.html