1413:确定进制
时间限制: 1000 ms 内存限制: 65536 KB
【题目描述】
69=42对于十进制来说是错误的,但是对于13进制来说是正确的。即, 6(13) 9(13)= 42(13), 而 42(13)=4131+2130=54(10)。
你的任务是写一段程序,读入三个整数p、q和 r,然后确定一个进制 B(2<=B<=40) 使得 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)=132+231+130=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。
【输入样例】
6 9 42
【输出样例】
13
#include<iostream>
#include<cmath>
using namespace std;
double jz(int,int,int);
int numlen(int);
double zh(int, int,int);
int main() {
long p, q, r;double res;
cin >> p >> q >> r;
res = jz(p, q, r);
cout << res;
}
double jz(int i1, int i2, int i3)
{
double jg1,jg2,jg3,i{};
int len = numlen(i3), len1 = numlen(i1), len2 = numlen(i2);
while (1)
{
double i = 2.0;
i += 1.0;
jg3 = zh(len, i, i3);
jg1 = zh(len1, i, i1);
jg2 = zh(len2, i, i2);
if (i > 40.0) break;
if (jg1 * jg2 == jg3) break;
}
if (jg1 + jg2 == jg3) return i;
else return 0;
}
int numlen(int s)
{
int sum = 0;
while (1) {
if (s > 0) sum++;
else break;
s /= 10;
}
return sum;
}
double zh(int, int, int)
{
return 0.0;
}
double zh(int lena, double zz,int ys)
{
int x3; double x4 = 0.0;
for (double j = lena - 1; j >= 0; j--) {
x3 = ys, ys%= 10;
if (ys <= 0) break;
x4 += pow(x3, zz);
ys = x3 / 10;
}
return x4;
}
运行结果:
输入:
6 9
输出:
0
我编译了三个函数,jz是求进制的意思,而numlen是求数字长度,zh是i进制转换为十进制。我debug了好久,各位有劳了。
谢谢了