写在前面
- 思路分析
- 进制转换函数
convert(n1, radix)
- 给定1个数值和1个进制,将它转化为10进制
- 转化过程中可能产生溢出
- 等值查找进制函数
find_radix
- 找到令两个数值相等的进制数
- 在查找的过程中,需要使用2分查找算法
- 使用当前进制转化得到数值比另1个大或小于0,说明这个进制太大或小
- 20个测试点,-_-||
- 进制转换函数
- 新
idea,
涨知识!
测试用例
-
input: 6 110 1 10 output: 2 intput: 1 ab 1 2 output: Impossible
ac代码
- 参考链接
-
#include <iostream> #include <cctype> #include <algorithm> #include <cmath> using namespace std; // 进制转换函数,注意与转10进制的区别 long long convert(string n, long long radix) { long long sum = 0; int index = 0, tmp = 0; for(auto it=n.rbegin(); it!= n.rend(); it++) { tmp = isdigit(*it) ? *it - '0' : *it - 'a' + 10; sum += tmp*pow(radix, index++); } return sum; } // 进制转换函数,注意与转10进制的区别 long long find_radix(string n, long long num) { char it = *max_element(n.begin(), n.end()); // 最小进制 long long low = (isdigit(it) ? it-'0' : it-'a'+10) + 1; // 最大进制 long long high = max(num, low); while(low <= high) { long long mid = (low+high) / 2; long long t = convert(n, mid); if(t<0 || t>num) high = mid - 1; else if(t == num) return mid; else low = mid + 1; } return -1; } int main() { string n1, n2; long long tag = 0, radix = 0, result_radix; cin >> n1 >> n2 >> tag >> radix; result_radix = tag == 1 ? find_radix(n2, convert(n1, radix)) : find_radix(n1, convert(n2, radix)); if(result_radix != -1) printf("%lld", result_radix); else printf("Impossible"); return 0; }
知识点小结
max_element / min_element
函数- 可用类型
vector<int>
vector<string>
int arr[4]
string arr[4]
- 也可用于结构体vector或结构体数组
#include <iostream> #include <algorithm> using namespace std; struct node { int x, y; }; bool cmp1(node a, node b) { return a.x > b.x; } int main() { string ss = "kngines"; cout << "org ss: " << ss << endl; cout << "reverse ss: "; for(auto it=ss.rbegin(); it!=ss.rend(); it++) cout << *it; cout << endl; // 字符串最大元素 ss = "123abc456"; char ch = *max_element(ss.begin(), ss.end()); cout << "max digit char: " << ch << " ,isdigit: " << isdigit(ch) << endl; vector<int> v = {3,7,2,5,6,4,9}; int arr[] = {3,7,2,5,6,4,9}; vector<node> v1(3); // 容器数组中最大元素 cout << *max_element(v.begin(), v.end()) << endl; // 最小元素 cout << *min_element(arr, arr + 7) << endl; // 结构体最大元素 cout << (*max_element(v1.begin(), v1.end(), cmp1)).y; return 0; }
- 可用类型