确定进制(OpenJudge1973 && POJ1331 )

确定进制( OpenJudge1973 && POJ1331
总时间限制
: 1000ms 内存限制 :65536kB
描述
6*9 = 42 对于十进制来说是错误的, 但是对于 13 进制来说是正确的。即 , 6(13)
* 9(13) = 42(13)
, 而 42(13) = 4 * 131+ 2 * 130= 54(10) 。 你的任
务是写一段程序读入三个整数
p q r , 然后确定一个进制 B(2<=B<=16) 使
p * q = r. 如果 B 有很多选择 , 输出最小的一个。 例如: p = 11, q = 11,
r = 121.
则有 11(3) * 11(3) = 121(3) 因为 11(3) = 1 * 31 + 1 * 30
= 4(10)
121(3) = 1 * 32 + 2 * 31 + 1 * 30 = 16(10) 。 对于进制 10,
11(10) * 11(10) = 121(10) 。 这种情况下, 应该输出 3 。 如果没有合适
的进制, 则输出
0
输入
一行, 包含三个整数
p q r , 相邻两个整数之间用单个空格隔开。 p q r
的所有位都是数字, 并且 1 <= p q r <= 1,000,000
输出
一个整数: 即使得
p * q = r 成立的最小的 B 。 如果没有合适的 B , 则输出 0
样例
1 输入
6 9 42
样例 1 输出
13
样例 2 输入
2 2 2
样例 2 输出
0
示: 经过计算, 可以确定
B 是小于 17
分析: 我们只需要从小到大枚举所有的进制 B , 如果当前的 B 可以满足等式, 就
输出
B , 如果一直到了 17 还没有答案, 那么就输出 0. 进制的转换也是需要注意

的, 且不需要高精度计算。


附AC码:

#include
#include
#include
#include
int a[10001]={0};
int b[10001]={0},kk;
void jinwei(int y){
    for(int i=1;i<=kk;i++)
        if(b[i]>=y){
		    b[i]-=y;
		    b[i+1]++;
		    kk=kk>i+1?kk:i+1;
		}
		else
		    return ;
}
int main(){
    int i,j=0,k,m,n,u,v,flag=0;
    scanf("%d%d%d",&n,&m,&k);
    while(k>0){
	    j++;
	    a[j]=k%10;
	    k/=10;
	}kk=1;
	for(i=2;i<17;i++){
	    for(j=1;j<=m;j++){
		    b[1]+=n;
			jinwei(i);     
		}
		for(j=1;j<=kk;j++){
		    if(b[j]!=a[j]){
		        for(u=1;u<=kk;u++)
		            b[u]=0;
			    flag=1;
			}
		}
	    for(u=1;u<=kk;u++)
		    b[u]=0;
	    if(flag==1){
		    flag=0;
		    continue;
		}
		v=i;
		break;
	}
	printf("%d\n",v);
	return 0;
}


你可能感兴趣的:(题目)