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,这就确定了进制的最小范围。
-
我们设计以下函数来简化程序流程:
- int minB(),根据p,q,r计算最小进制
- int nBto10(int num, int B),将B进制的数字num转化为10进制数
- 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
}