NOI-OJ 1.13 ID:34 确定进制

整体思路

  • 对于任意的p,q,r,可能使得p*q=r的最小进制应该是p,q,r三个数的所有数位中最大的数字+1,例如,6,9,42三个数中所有数位中最大的数字是9,故可能成立的最小进制是9+1,即10。题目告诉我们,最大进制B<=16,这就确定了进制的最小范围。

  • 我们设计以下函数来简化程序流程:

    1. int minB(),根据p,q,r计算最小进制
    2. int nBto10(int num, int B),将B进制的数字num转化为10进制数
    3. bool test(int B),测试p,q,r在进制B条件下是否成立
  • 为了简化函数形参,我们把p,q,r设置为全局变量

例程

#include<iostream>
using namespace std;
int p, q, r;							//定义为全局变量,可以简化函数参数传递

bool test(int B);
int nBto10(int num, int B);
int minB();								//三个函数的声明

int main(){
	int jz;
	cin>>p>>q>>r;
	jz=minB();
	while(jz<=16){						//从最小进制到16依次测试
		if(test(jz)){
			cout<<jz;					//成功即停止循环
			break;
		}
		jz++;
	}
	if(jz==17) cout<<"0";				//jz==17说明没有符合条件的进制
	return 0;
}

bool test(int B){
	int P = nBto10(p, B);				//B进制转换为10进制
	int Q = nBto10(q, B);
	int R = nBto10(r, B);
	if(P*Q==R)	return true;
	else 		return false;
}

int nBto10(int num, int B){
	int result=0;
	int i=1;
	while(num){							//进制转换过程
		result+=num%10*i;
		num/=10;
		i*=B;
	}
	return result;
}

int minB(){
	int max=0;
	int P=p, Q=q, R=r;					//求最大数位max
	while(P) { if(max<P%10) max=P%10; P/=10; }
	while(Q) { if(max<Q%10) max=Q%10; Q/=10; }
	while(R) { if(max<R%10) max=R%10; R/=10; }
	return max+1;						//别忘记+1
}
posted @ 2017-04-12 11:14  LFYZOI题解  阅读(1104)  评论(0编辑  收藏  举报