1. 程式人生 > >【演算法】1090: 十六進位制轉換

【演算法】1090: 十六進位制轉換

這個題目實現起來不是很難,因為一位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>

路漫漫其修遠兮,吾將上下而求索。