1056. 表达式
题目描述
表达式6×9=42对于十进制来说是错误的,但是对于十三进制来说是正确的。即6(13)×9(13)=42(13),而42(13)=4×131+2×130=54(10)。你的任务是写一段程序读入3个整数p、q和r,然后确定一个进制B(2≤B≤16)使得p×q=r。如果B有很多选择,输出最小的一个。例如:p=11,q=11,r=121。则有11(3) ×11(3)=121(3),11(10) ×11(10)=121(10)。这种情况下,输出3。如果没有合适的进制,则输出0。
输入
一行,3个B进制的正整数p、q、r(数位≤7)。
输出
使得p×q=r成立的最小进制B,如果没有合适的进制,则输出0。
样例输入
6 9 42
样例输出
13
数据范围限制
C++代码
#include <iostream>
#include <vector>
#include <cassert>
#include <cmath>
using namespace std;
const int max_digits = 7;
int getNumOfDigits(int n)
{
int numOfDigits = 0;
while (n > 0)
{
numOfDigits++;
n /= 10;
}
return numOfDigits;
}
int getDecimalNumber(int n, float B)
{
vector<int> digits;
int num = 0;
while (n > 0)
{
digits.push_back(n%10);
n /= 10;
}
for(int i=0; i<digits.size(); i++)
{
if (digits[i] >= B) // each digit should be less than B
{
num = 0;
break;
}
else
{
num += digits[i]*(int)(pow(B, i));
}
}
return num;
}
int findSmallestB(int p, int q, int r)
{
int pDecimal, qDecimal, rDecimal;
for (float B=2; B<=16; B++)
{
pDecimal = getDecimalNumber(p, B);
qDecimal = getDecimalNumber(q, B);
rDecimal = getDecimalNumber(r, B);
if (rDecimal == pDecimal*qDecimal && rDecimal > 0)
{
return (int)B;
}
}
return 0;
}
int main()
{
int p, q, r;
cin >> p >> q >> r;
assert(p>=1 && getNumOfDigits(p)<=max_digits);
assert(q>=1 && getNumOfDigits(q)<=max_digits);
assert(r>=1 && getNumOfDigits(r)<=max_digits);
int B = findSmallestB(p, q, r);
cout << B << endl;
return 0;
}