PAT 甲级 1010. Radix
来源:互联网 发布:穷人和富人的思维 知乎 编辑:程序博客网 时间:2024/05/24 05:09
原题传送门
- 目前来讲最难的,用到了二分思想
#include<cstdio>#include<cstring>#include<algorithm>using namespace std;typedef long long LL;LL Map[256]; // 0~9、a~z与10~35的对应LL inf = (1LL << 63) - 1; // long long的最大值2^63-1,注意加括号void init() { for (char c = '0'; c <= '9'; c++) { Map[c] = c - '0'; } for (char c = 'a'; c <= 'z'; c++) { Map[c] = c - 'a' + 10; // 将'a'~'z'映射到10~35 }}LL convertNum10(char a[], LL radix, LL t) { // 将a转换为十进制,t为上界 LL ans = 0; int len = strlen(a); for (int i = 0; i < len; i++) { ans = ans*radix + Map[a[i]]; // 进制转换 if (ans<0 || ans>t) return -1; // 溢出或超过N1的十进制 } return ans;}int cmp(char N2[], LL radix, LL t) { // N2的十进制与t进行比较 int len = strlen(N2); LL num = convertNum10(N2, radix, t); // 将N2转换为十进制 if (num < 0) return 1; // 溢出肯定是N2>t; if (t > num)return -1; // t较大,返回-1 else if (t == num)return 0; // 相等,返回0 else return 1; // num较大,返回1}LL binarySearch(char N2[], LL left, LL right, LL t) { // 二分求解N2的进制 LL mid; while (left <= right) { mid = (left + right) / 2; int flag = cmp(N2, mid, t); // 判断N2转换为十进制后与t比较 if (flag == 0)return mid; // 找到解,返回mid else if (flag == -1)left = mid + 1;// 往右子区间继续查找 else right = mid - 1; // 往左子区间继续查找 } return -1;}int findLargestDigit(char N2[]) { // 求最大的数位 int ans = -1, len = strlen(N2); for (int i = 0; i < len; i++) { if (Map[N2[i]] > ans) { ans = Map[N2[i]]; } } return ans + 1; // 最大的数位为ans,说明进制数的底线是ans+1}char N1[20], N2[20], temp[20];int tag, radix;int main() { init(); scanf("%s %s %d %d", N1, N2, &tag, &radix); if (tag == 2) { strcpy(temp, N1); strcpy(N1, N2); strcpy(N2, temp); } LL t = convertNum10(N1, radix, inf); // 将N1从radix进制转换为十进制 LL low = findLargestDigit(N2); // 找到N2中数位最大的位加1,当成二分下界 LL high = max(low, t) + 1; // 上界 LL ans = binarySearch(N2, low, high, t); // 二分 if (ans == -1) printf("Impossible\n"); else printf("%lld\n", ans); return 0;}
附原题:
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:
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
- PAT 甲级 1010. Radix
- PAT 甲级 1010. Radix
- [PAT-甲级]1010.Radix
- 【PAT甲级】1010. Radix (25)
- 1010. Radix (25) PAT 甲级
- PAT甲级1010. Radix (25)
- pat甲级1010. Radix (25)
- PAT甲级 1010. Radix (25)
- PAT 甲级 1010.Radix (25)
- PAT 甲级 1010. Radix (25)
- PAT甲级练习1010. Radix (25)
- PAT甲级1010:Radix
- 1010. Radix (25)-PAT甲级真题(二分法)
- PAT甲级 1010.Radix(25) 题目翻译与答案
- [PAT甲级]1010. Radix (25)(求另一个数的基数)
- PAT-甲级-1010 Radix(25)
- 1010. Radix (25)-PAT
- 【PAT】1010. Radix (25)
- 蓝桥杯 BEGIN-4 入门训练 Fibonacci数列
- poj 1273 Drainage Ditches
- Number Sequence (KMP算法(模板))
- 503 EOF错误
- PHY芯片 AR8033 学习笔记
- PAT 甲级 1010. Radix
- Android Material Design之Toolbar与Palette实践
- JAVA中三种URL连接方法
- OKHttp总结
- lua 5.1.5安装
- docker --helpmi帮助说明
- 探索Vue之简单双向绑定
- MYSQL函数及导出、导入数据库;执行SQL脚本
- 在浏览器中禁止拖动元素打开新界面