题解 | #进制转换#老实人的进制转换总结
进制转换
http://www.nowcoder.com/practice/8f3df50d2b9043208c5eed283d1d4da6
进制转换
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; }
注意
- 如果
num == 0
进不去while
循环,需要手动push
进0
; 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; }
以上
刷题总结类 文章被收录于专栏
这里记录一些刷题时候的总结思考