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

目录

[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;
}
相关推荐
大鱼>9 分钟前
多宠物家庭智能管理平台:云端架构与多设备协同实战
python·算法·iot·宠物
炸膛坦客30 分钟前
单片机/C/C++八股:(二十四)编译文件( .bin 和 .hex ,包括 .elf 和 .axf )
c语言·c++·单片机
To_OC43 分钟前
LC 22 括号生成:刷完这道题,我终于搞懂回溯剪枝了
javascript·算法·leetcode
To_OC1 小时前
LC 39 组合总和:回溯入门必刷题,我踩过的两个坑都在这了
javascript·算法·leetcode
数字杂技师1 小时前
每条推荐都很准,为什么我还是越刷越无聊?
算法
兰令水1 小时前
hot100【acm版】【2026.7.14打卡-java版本】
java·数据结构·算法·leetcode·面试
cpp_25011 小时前
P10098 [ROIR 2023] 地铁建设 (Day 2)
数据结构·c++·算法·贪心·二分答案·洛谷题解
hehelm2 小时前
IO 多路复用 — Reactor
linux·服务器·网络·数据库·c++
阳明山水2 小时前
TimesFM与Moirai MoE零样本预测解析
人工智能·深度学习·算法·机器学习·架构
铅笔侠_小龙虾3 小时前
Rust 学习(2)-变量、常量与 shadowing
学习·算法·rust