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;
}

看不懂,就多看几遍 > <

猜你喜欢

转载自blog.csdn.net/JustinAndy/article/details/105208675