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

目录

[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;
}
相关推荐
To_OC8 小时前
LC 1 两数之和:面试第一道必考题,暴力解法直接被面试官 pass
javascript·算法·leetcode
鱼鱼不愚与12 小时前
《原来如此 | 第01期:为什么导航软件能预测红绿灯倒计时?》
算法
博客180016 小时前
酷宝的使用方法,超好用的免费界面库,C++、MFC可用
c++·mfc·界面库·库来帮·酷宝
郝学胜_神的一滴17 小时前
CMake 026:属性体系精讲、四大作用域全解 & 实战代码落地
c++·cmake
复杂网络17 小时前
论最小 Agent 计算机的形态
算法
kisshyshy1 天前
🍦 雪糕、食堂、火车厢:三幅漫画吃透栈、队列与链表
javascript·算法
众少成多积小致巨1 天前
JNI (Java Native Interface) 技术手册中文参考指南
android·java·c++
猿人谷2 天前
不只是 CPU 阈值:STAR 如何用 GAT + Transformer 做容器级自动扩缩容?
人工智能·算法
复杂网络2 天前
Stable Diffusion 视觉大模型微调技术深度调研
算法