我不是聰明的人,所以我做了一天。我怕數據溢出,所以我都用字符串來存了。
利用之前1000位以內的二進制轉十進制的題,進行了修改。希望有所幫助。
不敢說多大的數字都可以AC,但基本上只要string可以容納,就都可以。也是挺通用的模板。
不過,不要想着很快就可以看懂我的代碼。怎麼說,我也是想了一天,你要是很快理解,我會很傷(嫉)心(妒)?
先給題目(好像是北大的題)
題目描述
寫出一個程序,接受一個十六進制的數值字符串,輸出該數值的十進制字符串(注意可能存在的一個測試用例裏的多組數據)。
輸入描述:
輸入一個十六進制的數值字符串。
輸出描述:
輸出該數值的十進制字符串。
示例1
輸入
0xA輸出
10
話不投機,打代碼。
#include <bits/stdc++.h>
using namespace std; //我很懶,所以很喜歡這個萬能的頭文件。
//對字符串進行乘法運算
string Multiple(string str, int x) //x表示要乘的進制,調用時輸入16
{
int carry = 0; //進制
for(int i = str.size()-1; i >= 0; i--)
{
int current = x * (str[i]-'0') + carry;
str[i] = current % 10 + '0';
carry = current / 10;
}
//因爲是乘法,所以進制很可能會是兩位數,例如 8 * 16 = 128,8在上面的循環中已經被存儲起來了
//所以接下來要存儲12,而且要存在字符串的前面。
string caStr;
int size = 0;
while(carry != 0)
{
caStr[size++] = carry % 10 + '0';
carry /= 10;
}
for(int i = 0; i < size; i++)
str = caStr[i]+str;
return str;
}
//對字符串進行加法運算
string Add(string str, char x)
{
int carry; //進制
if(x >= '0' && x <= '9')
carry = x - '0';
else
carry = x - 'A' + 10;
for(int i = str.size()-1; i >= 0; i--)
{
int current = str[i] - '0' + carry;
str[i] = current % 10 + '0';
carry = current / 10;
}
//這裏簡單很多,因爲加法只進一位。
if(carry != 0)
str = "1"+str;
return str;
}
int main()
{
string str;
while(cin >> str)
{
string answer = "0";
for(int i = 2; i < str.size(); i++)
{
answer = Multiple(answer, 16);
answer = Add(answer, str[i]);
}
cout << answer << endl;
}
return 0;
}
看不懂,就多看幾遍 > <