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条件の下に置かないようにしなければならない.前の考慮が不完全で本当に間違いやすいからだ.
#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;
}