C++中 min_element和 max_element 函数的用法
https://blog.youkuaiyun.com/liuchuo/article/details/79580773
主要采用二分法、进制转换。注意36进制的转换方法:将任意进制转换为十进制,比较十进制数是否相等。对于工作量较大的遍历,可以采用二分法,时间复杂度为Nlog(N)
isdigit函数的用法
如果isdigit函数包含在ctype.h头文件中,那字符串为数字。
计算过程:原型: int isdigit(char c)。
用法:#include <ctype.h>。
功能:判断字符c是否为数字。
说明:当c为数字0-9时,返回非零值,否则返回零。
这题坑太难排了!!!!!
radix的范围大小未知,2^64有可能是负数,也就是说进制转换后的数过大有可能是负数,所以这点要充分考虑。其次,二分法中判断条件一定要充分考虑,尽量不要把temp==num 放在else条件下,因为前面考虑不全真的很容易错。
#include<iostream>
#include<algorithm>
#include<string>
#include<math.h>
using namespace std;
long long baseConversion(string a, long long r1)
{
long long sum = 0;
int i;
for (i = a.size()-1; i >=0 ; i--)
{
if (!isdigit(a[i] ))
{
sum += pow(r1,a.size() - 1 - i)*(a[i] - 'a'+10 );
}
else
{
sum += pow(r1, a.size() - 1 - i)*(a[i] - '0');
}
}
return sum;
}
int findRadix(string b, long long deci)
{
long long temp;
char it = *max_element(b.begin(), b.end());
long long low, high, mid;
low = (isdigit(it) ? it - '0' : it - 'a' + 10) + 1;
high = max(deci,low);
while (low <= high)
{
mid = (low + high) / 2;
temp = baseConversion(b, mid);
if(temp > deci||temp<0)
{
high = mid - 1;
}
else if(temp == deci&&temp!=0)
{
return mid;
}
else
{
low = mid + 1;
}
}
return -1;
}
int main()
{
string n1, n2;
long long tag, radix;
cin >> n1 >> n2 >> tag >> radix;
if (tag == 1)
{
if (findRadix(n2, baseConversion(n1, radix)) == -1)
{
cout<<"Impossible";
}
else
{
cout << findRadix(n2, baseConversion(n1, radix));
}
}
else if (tag == 2)
{
if (findRadix(n1, baseConversion(n2, radix)) == -1)
{
cout << "Impossible";
}
else
{
cout << findRadix(n1, baseConversion(n2, radix));
}
}
return 0;
}