您的位置:首页 > 其它

1010. Radix (25)

2017-02-14 10:53 281 查看
根据未知进制数的各个未知的字符及已知进制数的数的大小来判断位置进制数进制的范围,然后再这个范围内进行二分查找

ps:额外判断一下个位数的情况

#include<iostream>
#include<string>
#include<cmath>
#pragma warning(disable :4244)
using namespace std;
long long int L, R;//存储两个数的十进制数
long long int change(string str1, long long int radix)//把radix进制的str1转换成10进制数,并返回
{
long long int x = 0;
for (auto y: str1)
{
x *= radix;
int num = y < 'a' ?y - '0' : y - 'a' + 10;
x += num;
}
return x;
}
int main()
{
int flag;
long long int radix;
string str1, str2;
cin >> str1 >> str2 >> flag >> radix;
if (flag == 2)
str1.swap(str2);//str1代表已知,str2代表未知的
L = change(str1, radix);//str1的十进制表示
long long int temp_min;//通过str2各个位置的数字判断最小进制数
for (auto x : str2)
{
int num =x<'a' ? x - '0' : x - 'a' + 10;
if (temp_min <= num + 1) temp_min = num + 1;
}
long long int radix_b, radix_e;//存储str2可能最小进制数及最大进制数
if (str2.size() > 1)
{
radix_b = pow((long double)L + 1, (long double)1 /str2.size()) - 1;//根据L在str2最大保存数R^(size)-1和最小保存数R^(size-1)之间来求进制数R的范围
radix_b = radix_b > temp_min ? radix_b : temp_min;
radix_e = pow((long double)L, (long double)1.0 / (long double)(str2.size() - 1)) + 1;
}
else if (change(str2, L + 1) == L) { cout << L + 1 << endl;return 0; }  //判断str2一位的情况,如果存在,输出最小进制数,即L+1
else { cout << "Impossible" << endl;return 0; }                         //不存在,impossible
long long int mid;
while (radix_b <= radix_e)                                              //在可能的最小进制数和最大进制数里面进行二分查找
{
mid = (radix_b + radix_e) / 2;
R = change(str2, mid);
if (R == L) { cout << mid << endl;return 0; }
if (R>L) radix_e = mid - 1;
if (R<L) radix_b = mid + 1;
}
cout << "Impossible" << endl;//未找到,即impossible
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  PAT-甲