【leetcode】数字转换为十六进制数c++

题目描述:
给定一个整数,编写一个算法将这个数转换为十六进制数。对于负整数,我们通常使用 补码运算 方法。

注意:

十六进制中所有字母(a-f)都必须是小写。
十六进制字符串中不能包含多余的前导零。如果要转化的数为0,那么以单个字符’0’来表示;对于其他情况,十六进制字符串中的第一个字符将不会是0字符。
给定的数确保在32位有符号整数范围内。
不能使用任何由库提供的将数字直接转换或格式化为十六进制的方法。

示例1:

输入:
26
输出:
“1a”

示例2:

输入:
-1
输出:
“ffffffff”

代码:

#include<sstream>
class Solution {
public:
    //10转2 32位
    string tentotwo(long long num){
        string s = "";
        while(num!=0){
            int a=num%2;
            string number;
            stringstream ss;
            ss<<a;
            ss>>number;
            s=s+number;
            num=num/2;
        }
        int ll=s.length();
        for(int i=0;i<(32-ll);i++)s=s+"0";
        cout<<s<<endl;
        reverse(s.begin(),s.end());
        return s;
    }
    string tentohex(int num){
        char numbers[6] = {'a','b','c','d','e','f'};
        string s = "";
        while(num!=0){
            int a=num%16;
            string number;
            stringstream ss;
            ss<<a;
            ss>>number;
            if(a>=10)s=s+numbers[a-10];
            else s=s+number;
            num=num/16;
        }
        reverse(s.begin(),s.end());
        return s;
    }
    //2进制转16进制
    string twotohex(string s){
        string numbers[7] = {"a","b","c","d","e","f","f"};
        int l=0,start=s.length()-1,end=s.length()-1;
        string r="";
        for(int i=s.length()-1;i>=0;i--){
            l=l+1;
            if(l==4){
                start=i;
                cout<<"start="<<start<<endl;
                int sum=0,m=0;
                for(int j=end;j>=start;j--){
                    cout<<"s[j]-'0'="<<s[j]-'0'<<endl;
                    sum=sum+(s[j]-'0')*pow(2,m);
                    m=m+1;
                }
                cout<<start<<" "<<end<<" "<<"sum:"<<sum<<endl;
                int index = sum-10;
                cout<<"index:"<<index<<endl;
                if(index>=0)r=r+numbers[index];
                else{
                    string number;
                    stringstream ss;
                    ss<<sum;
                    ss>>number;
                    r=r+number;
                }
                end=start-1;
                l=0;
            }
        }
        reverse(r.begin(),r.end());
        return r;
    }
    //按位取反
    string negate(string s){
        string ss="";
        for(int i=0;i<s.length();i++){
            if(s[i]=='0')ss+="1";
            else ss+="0";
        }
        return ss;
    }
    //2进制数加1
    string twoaddone(string s){
        int addflag=1;
        for(int i=s.length()-1;i>=0;i--){
            if(((s[i]-'0')+addflag)%2==0){
                s[i]='0';
                addflag=1;
            }
            else{
                s[i]='1';
                addflag=0;
                return s;
            }
        }
        return s;
    }
    //格式化
    string format(string s){
        string ss="";
        for(int i=0;i<s.length();i++){
            if(s[i]!='0'){
                cout<<"good"<<endl;
                ss=s.substr(i,s.length()-1-i+1);
                break;
            }
            if(i==s.length()-1)ss=ss+s[i];
        }
        return ss;
    }
    
    string toHex(int num) {
        if(num>0){
            return tentohex(num);
        }
        else{
            string s1=tentotwo((-1)*num);
            cout<<"10转2进制结果:"<<s1<<endl;

            string s2=negate(s1);
            cout<<"取反结果:"<<s2<<endl;

            string s3=twoaddone(s2);
            cout<<"+1结果:"<<s3<<endl;

            string s5=twotohex(s3);
            cout<<"2转16进制数结果:"<<s5<<endl;

            return format(s5);
        }
    }
};

求x的补码:
1.若x>0, 不变(要去多少进制就直接转为多少进制即可)
2.若x=0, 0
3.若x<0, 先x*(-1)变为正数,再二进制表示,然后各位取反,再加1,得到补码的二进制表示。若要求其他进制,则不要借助10进制,直接进行进制转换(因为有正负号,不能直接转为10进制)

注意特殊情况,-2147483648乘以-1后没法用int表示,超出范围,注意把tentotwo()函数的参数由int改为long long。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值