关于进制转换及其应用的算法题总结

目录

[B3620 x 进制转 10 进制 - 洛谷](#B3620 x 进制转 10 进制 - 洛谷)

[B3619 10 进制转 x 进制 - 洛谷](#B3619 10 进制转 x 进制 - 洛谷)

[P1555 USACO11NOV 尴尬的数字 Awkward Digits B - 洛谷](#P1555 [USACO11NOV] 尴尬的数字 Awkward Digits B - 洛谷)


B3620 x 进制转 10 进制 - 洛谷

cpp 复制代码
// B3620 x 进制转 10 进制
#include <bits/stdc++.h>

using namespace std;
int n;
string num;
long long res = 0;

int char2int(char c){
  // 字符转换成int类型
  if (c >= '0' && c <= '9')
  { // 如果数字是在0-9之内的
    return c - '0';
  }
  else
    return c - 'A' + 10; // 如果数字是 A B C D 这种的
}

int main(){
  cin >> n;
  cin >> num;
  res = char2int(num[0]);
  // 类比2进制转换成10进制的过程
  for (int i = 1; i < num.size(); i++){
    // 从最高位开始
    res = res * n + char2int(num[i]);
  }
  cout << res;
  return 0;
}

B3619 10 进制转 x 进制 - 洛谷

cpp 复制代码
// B3619 10 进制转 x 进制
// 基于短除法
#include <bits/stdc++.h>

using namespace std;
long long n;
int x;
vector<char> res;

char int2char(int num){
  if (num >= 0 && num <= 9)
    return '0' + num;
  else
    return 'A' + num - 10;
}

int main(){
  cin >> n >> x;
  while (n >= x)
  {                    // 短除法除到最后n是小于x的
    int yuShu = n % x; // 取余数
    res.push_back(int2char(yuShu));
    n = n / x;
  }
  res.push_back(int2char(n)); // 别忘了n
  for (int i = res.size() - 1; i >= 0; i--)
    cout << res[i];
  // 短除法是先获取的低位后获取的高位,所以需要逆序输出
  return 0;
}

P1555 USACO11NOV 尴尬的数字 Awkward Digits B - 洛谷

cpp 复制代码
// P1555 [USACO11NOV] 尴尬的数字 Awkward Digits B
#include <bits/stdc++.h>

using namespace std;
string a, b;

int char2int(char c){
  // 字符转换成int类型
  if (c >= '0' && c <= '9')
  { // 如果数字是在0-9之内的
    return c - '0';
  }
  else
    return c - 'A' + 10; // 如果数字是 A B C D 这种的
}

long long x2Ten(string t, int n){
  // x进制转换10进制
  long long res = char2int(t[0]);
  // 类比2进制转换成10进制的过程
  for (int i = 1; i < t.size(); i++){
    // 从最高位开始
    res = res * n + char2int(t[i]);
  }
  return res;
}

bool jd(long long n){
  // 把新数转三进制,逐位和原三进制字符串b比,统计不同位数
  int idx = 0;
  int cnt = 0;
  while (n >= 3){
    int yuShu = n % 3;
    char tmp = b[b.size() - 1 - idx];
    if (char2int(tmp) != yuShu)  cnt++;
    n = n / 3;
    idx++;
    if (cnt > 1)  return false;
  }
  if (n != char2int(b[0]))  cnt++;
  if (cnt != 1 || idx != b.size() - 1)
    return false;
  // 如果不同的位数不等于1 或 n转成3进制后长度和b不一样那么就false
  return true;
}

int main(){
  cin >> a >> b;
  long long ta = x2Ten(a, 2);
  long long tb = x2Ten(b, 3);
  // // 从高位开始遍历 去改变2进制的某一位
  for (int i = 0; i < a.size(); i++){
    long long l = 1 << (a.size() - i - 1);
    long long ta_tmp = -1;
    if (a[i] == '0'){
      // 如果第i位是0 那么我们就把它变成1 那么ta就会加上 l
      ta_tmp = ta + l;
    }
    else
      ta_tmp = ta - l;
    if (jd(ta_tmp)){
      cout << ta_tmp;
      break;
    }
  }
  return 0;
}
相关推荐
李可以量化1 分钟前
Redis Client 从入门到精通(一)下:redis-py 核心数据结构操作与连接管理
数据结构·redis·python·bootstrap·量化交易·qmt
疯狂打码的少年6 分钟前
【数据结构】复习日:树 + 图 + 排序(整理对比表)
数据结构·笔记·算法
benchmark_cc10 分钟前
Claude Code + MCP + QuantDash:打造全自动量化研究流水线的终极指南
人工智能·后端·爬虫·算法·claude·mcp·quantdash
tudousisi22223 分钟前
8.25第二题训练
c++
星星.72228 分钟前
2026河南萌新联赛第六场(郑州大学)补题B、D、L、J、I
数据结构·c++·算法
朝发如雪34 分钟前
快速掌握Linux(2)(时间相关函数)(文件IO)
linux·python·算法
Forever Nore42 分钟前
LeetCode 16 最接近的三数之和 - 双指针逼近
算法·leetcode·职场和发展
心仪久了会沦陷1 小时前
数据结构入门系列——顺序表详解:概念、分类与动态实现
c语言·数据结构·经验分享·笔记·开源
smj2302_796826521 小时前
解决leetcode第4033题有效K个不同元素子数组I
数据结构·python·算法·leetcode
witton1 小时前
xmake中将proto文件生成C/C++文件然后再编译链接进项目
c语言·c++·mingw·protobuf·xmake·protobuf-c·protoc-gen-c