• PAT1010


      1 /*二叉搜索来找进制数*/
      2 #include<iostream>
      3 #include<string>
      4 #include<vector>
      5 #include<iterator>
      6 using namespace std;
      7 
      8 
      9 
     10 /*转换成十进制,注意不能用POW求幂,因为POW返回为double*/
     11 long long turntodec(vector<int> v, long long radix)
     12 {
     13     long long sum = 0;
     14     long long m = 1;
     15     vector<int>::reverse_iterator riter = v.rbegin();
     16     for(; riter != v.rend(); ++riter)
     17     {
     18         sum += *riter * m;
     19         m *= radix;
     20     }
     21     return sum;
     22 }
     23 
     24 long long turntodec_c(vector<int> v, long long radix, long long limit)
     25 {
     26     long long sum = 0;
     27     long long m = 1;
     28     vector<int>::reverse_iterator riter = v.rbegin();
     29     for(; riter != v.rend(); ++riter)
     30     {
     31         sum += *riter * m;    
     32         m *= radix;
     33         if(sum > limit || sum < 0)
     34             return -1;
     35         /*sum<0 及其容易忽略的中间结果的判定条件*/
     36     }
     37     return sum;
     38 }
     39 
     40 /*不递归的二分搜索效率高*/
     41 long long binarysearch(vector<int> v, long long least, long long most, long long sum_other)
     42 {
     43     while(least <= most)
     44     {    
     45         long long mid = (least + most)/2;
     46         long long sum = turntodec_c(v, mid, sum_other);
     47         if(sum == sum_other)
     48             return mid;
     49         else if(sum == -1 )
     50             most = mid - 1;
     51         else 
     52             least = mid + 1;
     53     }
     54     return -1;
     55 }
     56 
     57 int main()
     58 {
     59     string n1, n2;
     60     int tag;
     61     long long radix;
     62     while(cin>>n1>>n2>>tag>>radix)
     63     {
     64         vector<int> v_n1, v_n2;
     65         long long n1_max_num = -1, n2_max_num = -1;
     66         for(int i=0; i < n1.size(); ++i)
     67             if(n1[i] >= 'a' && n1[i] <= 'z')
     68             {
     69                 v_n1.push_back(n1[i] - 'a' + 10);
     70                 if(tag == 2)
     71                     if(n1[i] - 'a' + 10 > n1_max_num)
     72                         n1_max_num = n1[i] - 'a' + 10;
     73             }
     74             else
     75             {
     76                 v_n1.push_back(n1[i] - '0');
     77                 if(tag == 2)
     78                     if(n1[i] - '0' > n1_max_num)
     79                         n1_max_num = n1[i] - '0';
     80             }
     81         for(int i=0; i < n2.size(); ++i)
     82             if(n2[i] >= 'a' && n2[i] <= 'z')
     83             {
     84                 v_n2.push_back(n2[i] - 'a' + 10);
     85                 if(tag == 1)
     86                     if(n2[i] - 'a' + 10 > n2_max_num)
     87                         n2_max_num = n2[i] - 'a' + 10;
     88             }
     89             else
     90             {
     91                 v_n2.push_back(n2[i] - '0');
     92                 if(tag == 1)
     93                     if(n2[i] - '0' > n2_max_num)
     94                         n2_max_num = n2[i] - '0';
     95             }
     96         if(tag == 1)
     97         {
     98             long long sum1 = turntodec(v_n1, radix);
     99             long long leastradix = n2_max_num + 1;
    100             long long mostradix = (sum1 + 1 > leastradix + 1 ) ? sum1 + 1 : leastradix + 1;
    101             long long result = binarysearch(v_n2, leastradix, mostradix, sum1);
    102             if(result == -1)
    103                 cout<<"Impossible"<<endl;
    104             else
    105                 cout<<result<<endl;
    106         }
    107         else if(tag == 2)
    108         {
    109             long long sum2 = turntodec(v_n2, radix);
    110             long long leastradix = n1_max_num + 1;
    111             long long mostradix = (sum2 + 1 > leastradix +1 ) ? sum2 + 1 : leastradix + 1;
    112             long long result = binarysearch(v_n1, leastradix, mostradix, sum2);
    113             if(result == -1)
    114                 cout<<"Impossible"<<endl;
    115             else
    116                 cout<<result<<endl;            
    117         }
    118     }
    119     return 0;
    120 }
  • 相关阅读:
    Android Action Bar简介
    Android UX & UI 最佳实践: 设计有效的导航
    Android Design Principles
    Android 4.4 KitKat 新特性
    Android 尺寸单位转换和屏幕适配相关
    Android UI线程和非UI线程
    初探机器学习之使用百度EasyDL定制化模型
    初探机器学习之使用百度AI服务实现图片识别与相似图片
    初探机器学习之推荐系统的基础知识
    熊逸《唐诗50讲》壮心篇
  • 原文地址:https://www.cnblogs.com/bochen-sam/p/3348889.html
Copyright © 2020-2023  润新知