早教吧 育儿知识 作业答案 考试题库 百科 知识分享

确定进制描述6*9=42对于十进制来说是错误的,但是对于13进制来说是正确的。即,6(13)*9(13)=42(13),而42(13)=4*131+2*130=54(10)。你的任务是写一段程序读入三个整数p、q和r,然后确

题目详情
确定进制
描述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。输入输入有 T组测试样例。 T在第一行给出。每一组测试样例占一行,包含三个整数p、q、r。 p、q、r的所有位都是数字,并且1 <= p、q、r <= 1,000,000。输出对于每个测试样例输出一行。该行包含一个整数:即使得p * q = r成立的最小的B。如果没有合适的B,则输出 0。样例输入3
6 9 42
11 11 121
2 2 2 样例输出13
3
0
▼优质解答
答案和解析
#include
#include
using namespace std;
bool OtherScaleToDecimal( int num, int scale, int &decimal_num )
{
decimal_num = 0;
int scale_factor = 1;
while ( num > 0 )
{
int unit = num % 10;
if ( unit >= scale )
return false;
decimal_num += unit * scale_factor;
num = num / 10;
scale_factor *= scale;
}
return true;
}
int CalcScale( int p, int q, int r )
{
int p1, q1, r1;
bool ret;
for ( int scale = 2 ; scale <= 16; scale++ )
{
ret = OtherScaleToDecimal ( p, scale, p1 );
if ( !ret )
continue;
ret = OtherScaleToDecimal( q, scale, q1 );
if ( !ret )
continue;
ret = OtherScaleToDecimal( r, scale, r1 );
if ( !ret )
continue;
if ( p1 * q1 == r1 )
return scale;
}
return 0;
}
void main()
{
int num, p, q, r, scale;
vector< int > scales;
cin >> num;
for( int i = 0; i < num; i++ )
{
cin >> p >> q >> r;
scale = CalcScale( p, q, r );
scales.push_back( scale );
}
for( int i = 0; i < num; i++ )
cout << scales[ i ] << endl;
}