写在前面
- 思路分析
- 进制转换函数
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:
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;
}