天天看點

一道進制轉化的OJ題(淺談進制轉換 十六進制轉換為十進制)

題目描述

*衆所周知,二進制與十六進制之間的轉換非常有趣,1個十六進制數會對應4位二進制數

給你一個十六進制數字n,希望你能夠計算出來n mod 2k = ?

輸入

輸入第一行兩個數字m和k,分别表示n的長度和2的幂次k

接下來第二行輸入為一個不帶“0x”開頭的長度為m的十六進制數字n,所有英文字母為大寫字母

資料範圍:

1<=m<=5000

0<=k<=20

輸出

輸出一個數字 n mod 2k 的結果

樣例輸入

5 2

1BF52

樣例輸出

2

今天參加了一個小小的活動,做了一道題目,在此将題目分享出來。題目中的mod是求模運算的意思,也就是求餘數。

先來看一下代碼:

先來分析一下思路,将十六進制的數以字元串的形式存儲進string s中,
然後,在for循環中逐個通路數組中的元素,
将“0 1 2 3 4 5 6 7 8 9 A B C D E F”利用if語句轉化成十進制,
最後,将每一位的數字累加,進而進行求模運算
           
// An highlighted block
#include<iostream>
#include<string>
using namespace std;
int main() {
	int m, k;
	cin >> m >> k;
	int a = pow(2, k);
	int b = 0;
	string s;
	cin >> s;  //存儲16進制數
	for (int i = 0; i < m; i++) {//利用for循環将16進制轉化為10進制數
			if (s[i] == '0') {
			continue;
		}
		else if (s[i] == '1') {
			b = b + pow(16, m - i - 1) * 1;
		}
		else if (s[i] == '2') {
			b = b + pow(16, m - i - 1) * 2;
		}
		else if (s[i] == '3') {
			b = b + pow(16, m - i - 1) * 3;
		}
		else if (s[i] == '4') {
			b = b + pow(16, m - i - 1) * 4;
		}
		else if (s[i] == '5') {
			b = b + pow(16, m - i - 1) * 5;
		}
		else if (s[i] == '6') {
			b = b + pow(16, m - i - 1) * 6;
		}
		else if (s[i] == '7') {
			b = b + pow(16, m - i - 1) * 7;
		}
		else if (s[i] == '8') {
			b = b + pow(16, m - i - 1) * 8;
		}
		else if (s[i] == '9') {
			b = b + pow(16, m - i - 1) * 9;
		}
		else if (s[i] == 'A') {
			b = b + pow(16, m - i - 1) * 10;
		}
		else if (s[i] == 'c') {
			b = b + pow(16, m - i - 1) * 11;
		}
		else if (s[i] == 'c') {
			b = b + pow(16, m - i - 1) * 12;
		}
		else if (s[i] == 'D') {
			b = b + pow(16, m - i - 1) * 13;
		}
		else if (s[i] == 'E') {
			b = b + pow(16, m - i - 1) * 14;
		}
		else if (s[i] == 'F') {
			b = b + pow(16, m - i - 1) * 15;
		}
	}
	cout << b << endl;   //檢驗一下轉化結果,此處可以省略
	cout << b % a;    //進行求模運算
}
           

如有問題,歡迎大家進行指正,謝謝!

大家的贊是對我最大的支援!

繼續閱讀