PAT 甲级1010

C++中 min_element和 max_element 函数的用法
https://blog.csdn.net/liuchuo/article/details/79580773

主要采用二分法、进制转换。注意36进制的转换方法:将任意进制转换为十进制,比较十进制数是否相等。对于工作量较大的遍历,可以采用二分法,时间复杂度为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;
}







你可能感兴趣的:(算法,二分法,进制转换,数据结构)