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

目录

[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;
}
相关推荐
多加点辣也没关系12 小时前
数据结构与算法|第二十三章:高级数据结构
数据结构·算法
孬甭_14 小时前
初识数据结构与算法
数据结构
hoiii18714 小时前
孤立森林 (Isolation Forest) 快速异常检测系统
算法
c++之路15 小时前
适配器模式(Adapter Pattern)
java·算法·适配器模式
吴声子夜歌16 小时前
Java——接口的细节
java·开发语言·算法
myheartgo-on16 小时前
Java—方 法
java·开发语言·算法·青少年编程
汉克老师17 小时前
GESP6级C++考试语法知识(四、图与树(四))
c++·贪心算法·优先队列·哈夫曼编码·哈夫曼树·gesp6级·gesp六级
宝贝儿好17 小时前
【LLM】第三章:项目实操案例:智能输入法项目
人工智能·python·深度学习·算法·机器人
子兮曰18 小时前
whisper.cpp 深度解析:从边缘设备到实时语音识别
前端·c++·后端