进制转换

H2D

16进制转10进制挺好写,直接类似科学计数法,每一位乘以对应的幂;

#include
using namespace std;
int main()
{
string inputStr;
while (cin >> inputStr)
{
int ans=0;
inputStr=inputStr.substr(2); //subStr(position,len)
for(auto ch:inputStr)
{
if(isdigit(ch)) ans=ans*16+ch-'0';
else ans=ans*16+ch-'A'+10;
}
cout<<ans<<endl;
}
return 0;
}

D2H

10进制转16进制,就是0 -> 0, 1 -> 1, ... ,10 -> A, 11 -> B, ... ,那么就是用num对16取余,然后根据余数,得到对应位置的数,最后放到一个栈里面,逆序打印出来即可;

#include<bits/stdc++.h>
class Solution {
public:
    void D2H(int num) {
        std::stack<int> ans;
        std::vector<int> table(16);
        for (int i = 0; i < 10; ++i) table[i] = 48 + i;
        for (int i = 10; i < 16; ++i) table[i] = 55 + i;
        if (num == 0) ans.push(0);
        int remain = 0;
        while(num) {
            remain = num % 16;
            ans.push(remain);
            num = num / 16;
        }
        while (!ans.empty()) {
            std::cout << (char)(table[ans.top()]);
            ans.pop();
        }
        std::cout << std::endl;
    }
};
int main() {
    int num;
    while (std::cin >> num) {
        Solution A;
        A.D2H(num);
    }
    return 0;
}

这里的代码是我今天重新写的,所以风格不一致,最近强迫自己保持良好的代码风格,突然觉得多加空格是一个很舒服的事情(保持大拇指的参与,哈哈!)

Dto26

这里是我写这篇总结的原因,之前面试的时候,让我写10进制转26进制,以为和转16进制一样,直接通过余数来控制,也就是0 -> A, 1 -> B, ... ,10 -> J, 11 -> K, ... ,25 -> Z,那么就是

#include<bits/stdc++.h>
class Solution {
public:
    void Dto26(int num) {
        std::stack<int> ans;
        std::vector<int> table(26);
        for (int i = 0; i < 26; ++i) table[i] = 65 + i;
        if (num == 0) ans.push(0);
        int remain = 0;
        while(num) {
            remain = num % 26;
            ans.push(remain);
            num = num / 26;
        }

        while (!ans.empty()) {
            std::cout << (char)(table[ans.top()]);
            ans.pop();
        }
        std::cout << std::endl;
    }
};
int main() {
    int num;
    while (std::cin >> num) {
        Solution A;
        A.Dto26(num);
    }
    return 0;
}

注意

  1. 如果num == 0 进不去while循环,需要手动push0
  2. while (std::cin >> num) 通过Ctrl + D + Enter 退出,和Linux里面一样
    ,应该是继承自Linux

Dto26 字符对应方式改变

如果这里的对应方式改变一下,1 -> A, 2 -> B, ... ,11 -> J, 12 -> K, ... ,26 -> Z,那么在代码中应该如何转换呢?
我们还是通过取余的方式来对应,余数1 -> A, 2 -> B, ... ,11 -> J, 12 -> K, ... ,26 -> Z,那么%26如何得到26呢?如果是26%26那么余数是0,我们直接将余数重新赋值即可

#include<bits/stdc++.h>
class Solution {
public:
    void Dto26(int num) {
        std::stack<int> ans;
        int remain = 0;
        while (num) {
            remain = num % 26;
            if (remain == 0) remain = 26;
            ans.push(remain);
            num = (num - remain) / 26;
        }
        while (!ans.empty()) {
            std::cout << (char)(ans.top() + 'a' - 1);
            ans.pop();
        }
        std::cout << std::endl;
    }
};
int main() {
    int num;
    while (std::cin >> num) {
        Solution A;
        A.Dto26(num);
    }
    return 0;
}

以上