16進制轉十進制(字符串版)

我不是聰明的人,所以我做了一天。我怕數據溢出,所以我都用字符串來存了。

利用之前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;
}

看不懂,就多看幾遍 > <

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章