1. 程式人生 > >藍橋杯 基礎練習 十六進位制轉十進位制

藍橋杯 基礎練習 十六進位制轉十進位制

問題描述   從鍵盤輸入一個不超過8位的正的十六進位制數字符串,將它轉換為正的十進位制數後輸出。
  注:十六進位制數中的10~15分別用大寫的英文字母A、B、C、D、E、F表示。 樣例輸入 FFFF 樣例輸出 65535 解答: 1、問題分析:進位制轉換問題是程式設計練習經常涉及到的一類題目。首先,這類題目個人總結有兩種做法: (1)位權法; (2)二進位制中轉轉換法 相對來說,位權法更直接高效,邏輯性比較強,而通過二進位制轉換這樣一種途徑更加簡單,但是運算量大,而且程式碼長度很長,不利於理解,本人增加傾向於使用位權法來解決此類題目。 參考程式碼: #include<iostream>//輸入輸出流標頭檔案
#include<string.h> //字串處理標頭檔案
using namespace std; //申請名稱空間

int main(){
char s[8]; //根據題目要求字元數量不能超過8位,因此定義一個長度為8的字串陣列

while(cin >> s){ //輸入字串內容
int len = strlen(s);//通過strlen獲取輸入字串的長度
long long int m = 0,n = 16; //由於8位16進位制數表示的範圍超出了int所能夠表示的範圍,因此定義為long long型別

for(int i = 0;i < len;i++){ //通過分離0~9和A~F來計算轉換後的十進位制數
if(s[i] >= '0' && s[i] <= '9'){
m = m * n + (s[i] - '0');

else{
m = m * n + (s[i] - 'A' + 10);
}
}
cout << m;
}

return 0;
}
核心程式碼:

通過迴圈控制和條件選擇對字串每一位進行轉換後相加 以題中所給字串為例:
最難理解的是else語句裡面的語句“m = m * n + (s[i] - 'A' + 10);” (s[i] - 'A' + 10)是什麼?
(s[i] - 'A' + 10) 其實就是A、B、C、D、E、F 所對應的十進位制數,只不過這裡需要通過ACSLL碼來轉換一下而已。
前面的 m * n 疊加起來就是權值16 的次方。