HJ5 进制转换

151 阅读2分钟

题目描述

写出一个程序,接受一个十六进制的数,输出该数值的十进制表示。数据范围:保证结果在1≤n≤2的31次方−1。题源

输入描述

输入一个十六进制的数值字符串。

输出描述

输出该数值的十进制字符串。不同组的测试用例用\n隔开。

示例

输入:0xAA
输出:170

思路

要知道16进制转10进制是怎么转换的:从高位到低位,每个数字乘以16的n-1次方。核心代码就是这个思想。

法1 输入字符串s,计算其长度s.size(),用for循环一个一个字符处理。

法2 输入字符数组s,计算其长度strlen(s),用for循环一个一个字符处理。

具体实现

法1

#include <bits/stdc++.h>
using namespace std;
int main() {
    string s;
    cin>>s;
    int ans=0;
    int len = s.size(); //字符串长度
    int pos = s.find('x');
    for(int i=pos+1; i<len; i++){
        ans=ans*16;
        if(s[i]>='0' && s[i]<='9') ans+=(s[i]-'0');
        else ans+= (s[i]-'A')+10;
    }
    cout<<ans;
}

法2

#include <bits/stdc++.h>
using namespace std;
int main() {
    char s[100];
    cin>>s;
    int ans=0;
    int len = strlen(s); //计算字符数组的长度
    for(int i=2; i<len; i++){
        ans=ans*16;
        if(s[i]>='0' && s[i]<='9') ans+=(s[i]-'0'); //将字符转化为数字-'0'
        else ans+= (s[i]-'A')+10; //字符为字母且大于9,A是10,所以-A,再加10,因为是转10进制 
    }
    cout<<ans;
}

(这两个代码还是有区别的,如果直接输入十六进制而不加前边的ox,则法1和法2方法都一样。但是考虑到前边是否会带ox,法1比法2的代码要好,因为对ox的处理更灵活。)

小结

  • 无论是用字符串还是字符数组,核心代码都是for循环里的三行。都是对字符串中的单个字符,进行处理,转换。

  • 单个字符变数字要-'0'。

  • 在算法笔记中有进制转换的核心代码,不懂了及时回顾。