0
点赞
收藏
分享

微信扫一扫

A1010 Radix (25 分| 二分查找,附详细注释,逻辑分析)


写在前面

  • 思路分析
  • 进制转换函数​​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;
}


举报

相关推荐

0 条评论