这类题目归结于常用技巧与算法,有很鲜明的套路,重在理解其规则,通常写起来不算太复杂。
题目描述:
题目大致意思:
给出两个数N1和N2,这两个数的长度不超过10位,再给出一个标志位,如果是1,则后面的数是N1的进制,如果是2,则后面的数是N2的进制,要求求出另外一个数为多少进制时跟所给出的数相等,并且输出该进制,如果不存在相等,则输出Impossible。
大致思路:
用两个字符串来接收N1和N2,便于进行处理。用两个整形来接收标志位和进制位,将所给出进制的数转化成十进制,未给出进制位的数,使用二分法,找出最小的进制位。
提交结果:
这道题说简单还算简单,说难还真的有点难。思路较为简单,但一不小心就会溢出,这次很多测试用例都未通过,放在二刷时,接着杠。
提交代码如下:
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
long long to_decimal(string str, int base);
void func(long long num, string str);
int main()
{
string str1, str2;
int tag, base;
long long num;
cin >> str1 >> str2 >> tag >> base;
if (tag == 1)
{
num = to_decimal(str1, base);
func(num, str2);
}
else
{
num = to_decimal(str2, base);
func(num, str1);
}
}
void func(long long num,string str)
{
char temp=str[0];
for (int i = 0; i < str.size(); i++)
{
if (temp < str[i])
temp = str[i];
}
int low;
if (temp >= 'a')
{
low = temp - '0' - 38;
}
else
{
low = temp - '0'+1;
}
int high = 100;
if (to_decimal(str, low) > num)
{
cout << "Impossible" << endl;
return;
}
if (to_decimal(str, high) < num)
{
cout << "Impossible" << endl;
return;
}
int mid;
while (low <= high)
{
mid = (low + high) / 2;
if (to_decimal(str, mid) == num)
{
cout << mid << endl;
return;
}
else if (to_decimal(str, mid) > num)
high = mid - 1;
else
low = mid + 1;
}
cout << "Impossible" << endl;
return;
}
long long to_decimal(string str, int base)
{
long long sum = 0;
int j = 0;
for (int i = str.size() - 1; i >= 0; i--)
{
sum = sum + (str[i]-'0') * pow(base,j);
j++;
}
return sum;
}
本次提交后累计得分377,排名为16785。