PAT甲級1010
C++中min_Elementとmax_element関数の使い方https://blog.csdn.net/liuchuo/article/details/79580773
主に二分法、進数変換を採用している.注意36進数の変換方法:任意の進数を10進数に変換し、10進数が等しいかどうかを比較します.作業量の多い遍歴については,二分法を用いることができ,時間的複雑度はNlog(N)である.
isdigit関数の使い方isdigit関数がctypeに含まれている場合.hヘッダファイルでは、その文字列は数字です.計算プロセス:プロトタイプ:int isdigit(char c).使用法:#include.機能:文字cが数字であるか否かを判断する.説明:cが0-9の場合、ゼロ以外の値が返されます.そうでない場合、ゼロが返されます.この問題の穴は並べにくい!!!radixの範囲の大きさは不明ですが、2^64は負数である可能性があります.つまり、進数変換後の数が大きすぎると負数である可能性がありますので、この点は十分に考慮してください.次に、二分法では条件を十分に考慮し、できるだけtemp=numをelse条件の下に置かないようにしなければならない.前の考慮が不完全で本当に間違いやすいからだ.
主に二分法、進数変換を採用している.注意36進数の変換方法:任意の進数を10進数に変換し、10進数が等しいかどうかを比較します.作業量の多い遍歴については,二分法を用いることができ,時間的複雑度はNlog(N)である.
isdigit関数の使い方isdigit関数がctypeに含まれている場合.hヘッダファイルでは、その文字列は数字です.計算プロセス:プロトタイプ:int isdigit(char c).使用法:#include.機能:文字cが数字であるか否かを判断する.説明:cが0-9の場合、ゼロ以外の値が返されます.そうでない場合、ゼロが返されます.この問題の穴は並べにくい!!!radixの範囲の大きさは不明ですが、2^64は負数である可能性があります.つまり、進数変換後の数が大きすぎると負数である可能性がありますので、この点は十分に考慮してください.次に、二分法では条件を十分に考慮し、できるだけtemp=numをelse条件の下に置かないようにしなければならない.前の考慮が不完全で本当に間違いやすいからだ.
#include
#include
#include
#include
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;
}