【演算法】1090: 十六進位制轉換
阿新 • • 發佈:2018-12-15
這個題目實現起來不是很難,因為一位16進位制數可以用4位二進位制數來表示,一位8進位制數可以用3位二進位制數來表示,這樣通過二進位制數便在16進位制數和8進位制數之間架起了橋樑。
這裡我直接採用C++中的string類來寫,方便快捷,可行性高,但有些地方需要注意,有些地方仍然值得在以後的程式設計中借鑑,且看程式碼:
#include<string> #include<iostream> using namespace std; int main() { string s1; cin >> s1; if (s1 == "0") { cout << 0 << endl; return 0; } string s2; for (int i = 0; i < s1.length(); i++) { switch (s1[i]) { case '0':s2 += "0000"; break; case '1':s2 += "0001"; break; case '2':s2 += "0010"; break; case '3':s2 += "0011"; break; case '4':s2 += "0100"; break; case '5':s2 += "0101"; break; case '6':s2 += "0110"; break; case '7':s2 += "0111"; break; case '8':s2 += "1000"; break; case '9':s2 += "1001"; break; case 'A':s2 += "1010"; break; case 'B':s2 += "1011"; break; case 'C':s2 += "1100"; break; case 'D':s2 += "1101"; break; case 'E':s2 += "1110"; break; case 'F':s2 += "1111"; break; default: break; } } int L2 = s2.length(); if (L2 % 3 == 1) {// 判斷是否需要新增字首0 s2 = "00" + s2; }else if(L2 % 3 == 2) { s2 = "0" + s2; } bool flag = false; for (int i = 0; i <= s2.length() - 3; i += 3) { int num = 4 * (s2[i] - '0') + 2 * (s2[i + 1] - '0') + (s2[i + 2] - '0'); if (num) {// 這裡的做法值得記住 flag = true;//忽略前導0-->直到找到第一個不為0的將flag變為true 然後flag一直為true,即使後面有0出現也要將0輸出 } if (flag) cout << num; } cout << endl; return 0; }
在以後的程式設計中要善於用一些小技巧,也要學會利用現有的C++標準庫(即在OJ中可以直接使用的庫,譬如這裡的string類),這裡說明一下,在C++中string是一個類;
C++中使用string類需要將它include進來:
#include<string>
C中,string.h是對字串的一系列操作(譬如strlen函式等等),並不是一個類(C中也沒有類的概念),要使用這些個函式也要將它include進來:
#include<string.h>
C++大多數情況下是相容C的,所以C中的string.h在C++中就變成了cstring,在C++中要使用strlen等這些個函式需要將它include進來(當然你#include<string.h>也是可以的):
#include<cstring>
路漫漫其修遠兮,吾將上下而求索。