华为笔试题5:进制转换

题目描述

写出一个程序,接受一个十六进制的数值字符串,输出该数值的十进制字符串。(多组同时输入 )

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

输出描述:输出该数值的十进制字符串。

输入:0xA

输出:10


解题思路:

解题代码:

       1.这种解法是转换为数字,其实是不符合题意的,题意要求输出为十进制字符串,而且转化为数值会有大数问题,会有溢出。因此正确的做法为字符串操作。

#include<iostream>
#include<string>
using namespace std;
int main(){
    string s;
    while(cin>>s){
        int length = s.size();
        if(length  <= 2)
            continue;
        if(s[0]!='0' || s[1]!='x')
            continue;
        
        int res =0;
        int flag =1;
        for(int i=length-1;i>1;--i){
            char cur = s[i];
            if(cur>='A'&&cur<='F'){
                res+=(cur-'A'+10)*flag;
            }
            else if(cur>='0' && cur<='9'){
                res+=(cur-'0')*flag;
            }
          //  else
          //      continue;
            flag*=16;
        }    
        cout<<res<<endl;    
    }
    return 0;
}

       2.

 

补充知识:关于进制转换和ASCII码的知识!!!

        【1】关于大小写转换,A到a,不需要记A(65)的ASCII码与a(97)的ASCII码的差值32.可以直接:

                 小写转换大写为:str[i]-('a'-'A')

                 大写转为小写为:str[i]+('a'-'A')

        【2】进制转换问题,如上面的思想,如果用数值计算的方法则:可以从高位到低位,也可以从低位到高位计算累加。

简单的方法是设置个flag位表示每个数位的权值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值