• PATA 1010 Radix(进制转换)


    1010 Radix

    分数 25

    作者 CHEN, Yue

    单位 浙江大学

    Given a pair of positive integers, for example, 6 and 110, can this equation 6 = 110 be true? The answer is yes, if 6 is a decimal number and 110 is a binary number.

    Now for any pair of positive integers N1​ and N2​, your task is to find the radix of one number while that of the other is given.

    Input Specification:

    Each input file contains one test case. Each case occupies a line which contains 4 positive integers:

    1. N1 N2 tag radix

    Here N1 and N2 each has no more than 10 digits. A digit is less than its radix and is chosen from the set { 0-9, a-z } where 0-9 represent the decimal numbers 0-9, and a-z represent the decimal numbers 10-35. The last number radix is the radix of N1 if tag is 1, or of N2 if tag is 2.

    Output Specification:

    For each test case, print in one line the radix of the other number so that the equation N1 = N2 is true. If the equation is impossible, print Impossible. If the solution is not unique, output the smallest possible radix.

    Sample Input 1:

    6 110 1 10
    

    Sample Output 1:

    2
    

    Sample Input 2:

    1 ab 1 2
    

    Sample Output 2:

    Impossible

    注意另外一个字符串的进制并不是简单的最大36进制,有可能是无穷进制,这就需要用二分法来求解。并且需要把两外一个字符串的最小进制求解出来,否则会出错(我写了另外一个代码,没有求出最小进制,有一个测试点过不了,现在也没找出原因)。并且转进制所求的数应该开 long long ,int 会爆。

    AC代码:

    1. #include <iostream>
    2. #include <cstring>
    3. #include <algorithm>
    4. #include <cmath>
    5. using namespace std;
    6. typedef long long LL;
    7. //val初值为无穷大,得到第一个十进制数,看stoLL函数就能理解了
    8. LL val = 1e18;
    9. //s radix进制转换为十进制
    10. LL stoLL(string s, LL radix)
    11. {
    12. LL res = 0, index = 1;
    13. for(int i=s.size()-1; i>=0; --i)
    14. {
    15. int v;
    16. if(isdigit(s[i]))
    17. v = s[i] - '0';
    18. else
    19. v = s[i] - 'a' + 10;
    20. res += v * index;
    21. index *= radix;
    22. if(res > val) //如果res大于val,说明radix进制肯定大了
    23. break;
    24. }
    25. return res;
    26. }
    27. int main()
    28. {
    29. string s[3];
    30. LL tag, radix;
    31. cin >> s[1] >> s[2] >> tag >> radix;
    32. val = stoLL(s[tag], radix);
    33. //找到另外一个字符串的最小进制
    34. LL l = 0, r = val + 1;
    35. for(int i=0;i<s[tag ^ 3].size();++i)
    36. {
    37. LL v;
    38. if(isdigit(s[tag ^ 3][i]))
    39. v = s[tag ^ 3][i] - '0';
    40. else
    41. v = s[tag ^ 3][i] - 'a' + 10;
    42. l = max(l,v + 1);
    43. }
    44. //二分
    45. while(l < r)
    46. {
    47. LL mid = l + r >> 1;
    48. if(stoLL(s[tag ^ 3], mid) >= val)
    49. r = mid;
    50. else
    51. l = mid + 1;
    52. }
    53. if(stoLL(s[tag ^ 3], l) == val)
    54. cout << l << endl;
    55. else
    56. puts("Impossible");
    57. return 0;
    58. }

    有一个测试点通不过,求大佬找错误:

    1. #include <iostream>
    2. #include <cstring>
    3. #include <algorithm>
    4. #include <cmath>
    5. using namespace std;
    6. typedef long long LL;
    7. LL val = 1e18;
    8. LL stoLL(string s, LL radix)
    9. {
    10. LL res = 0, index = 1;
    11. for(int i=s.size()-1; i>=0; --i)
    12. {
    13. int v;
    14. if(isdigit(s[i]))
    15. v = s[i] - '0';
    16. else
    17. v = s[i] - 'a' + 10;
    18. //如果radix比本身的元素都要小,那么这个进制肯定小了,将答案赋为负值退出
    19. if(v >= radix)
    20. {
    21. res = -1e9;
    22. break;
    23. }
    24. res += v * index;
    25. index *= radix;
    26. if(res > val)
    27. break;
    28. }
    29. return res;
    30. }
    31. int main()
    32. {
    33. string s[3];
    34. LL tag, radix;
    35. cin >> s[1] >> s[2] >> tag >> radix;
    36. val = stoLL(s[tag], radix);
    37. LL l = 0,r = max(val + 1, 36ll);
    38. while(l < r)
    39. {
    40. LL mid = l + r >> 1;
    41. if(stoLL(s[tag ^ 3], mid) >= val)
    42. r = mid;
    43. else
    44. l = mid + 1;
    45. }
    46. if(stoLL(s[tag ^ 3], l) == val)
    47. cout << l << endl;
    48. else
    49. puts("Impossible");
    50. return 0;
    51. }

  • 相关阅读:
    影响金融软件开发价格的因素有哪些?
    C字符串操作笔记
    sql 注入(2), 文件读写 木马植入 远程控制
    Postgresql源码(88)column definition list语义解析流程分析
    Linux环境下测试服务器的DDR5内存性能
    HTML做一个个人博客页面(纯html代码)
    微信小程序实现类似于 vue中ref管理调用子组件函数的方式
    22-07-31周总结
    cocoapods使用
    React-Router路由
  • 原文地址:https://blog.csdn.net/qq_51825761/article/details/127834932