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;
}
原文地址:https://www.cnblogs.com/May-2nd/p/14733361.html