C 十六进制转换成十进制数字的问题

hulongchuan 2014-08-04 02:07:02
如题,比如字符串:ABcd123456789ACD123456879,如何转换为十进制数字,已经超过各种数据类型的范围,这种大数据怎么处理?大牛们快来贴来代码,一起探讨一下吧~
...全文
256 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2014-08-06
  • 打赏
  • 举报
回复
12楼代码如果不使用固定长度的数组,改用malloc、realloc、free动态长度的数组就更完美了。
  • 打赏
  • 举报
回复
支持!!
引用 12 楼 hulongchuan 的回复:
经过不懈研究,终有所成!以下为源代码,草草写的,


#include <stdio.h>
#include <string.h>


int judge_value(char c)
{
        int x;

        if(c >= '0' && c <= '9')
                x = c - '0';
        else if(c >= 'A' && c <= 'F')
                x = c - 'A' + 10;
        else if(c >= 'a' && c <= 'f')
                x = c - 'a' + 10;
        else
        {
                printf("charactor error!\n");
                return -1;
        }

        return x;
}

void printf_array(char a[])
{
    int i = 0;
    while(a[i] != '\0')
        printf("%c", a[i++]);
}

char * get_result(char *res, char *dest)
{
    char *pres = res;
    char *pdest = dest;
    if(res == NULL || *res == '\0')
    {
        perror("NULL  parameter");
        return NULL;
    }
    while(*pres)
       pres++;

    pres--;
    while(pres >= res)
    {
        if(*pres == '0')
        {
            pres--;
        }
        else
            break;
    }
    while(pres >= res)
    {
        *pdest++ = *pres--;
    }

    return dest;
}
int main()
{
        char tmp1[64] = "0";
        char tmp2[64] = "0";
        char result[64] = "\0";
        //char *s = "ABCDEF456789123";
        char s[64] = {};
        char *ps , *pr = result;

        long count = 1, i = 0;
        int x = 0, k = 0, j = 0, is_overflow = 0;
 
        gets(s);
        ps = s;
        while(*ps)
                ps++;

        ps--;


        memset(tmp1, '0', sizeof(tmp1)-1);
        tmp1[255] = '\0';
        memset(tmp2, '0', sizeof(tmp2)-1);
        tmp2[255] = '\0';
        while(ps >= s)
        {
                x = judge_value(*ps);   //字符‘1’ 转换成 1
                i = x * count;
                do
                {
                     if(i/10 > 0)
                         tmp1[k++] = i%10+'0';
                     else if(i/10 == 0)
                     {
                         tmp1[k] = i+'0';
                         break;
                     }
                }while((i=i/10) > 0);     //把算得的数按位存放在tmp1数组中

 

                while(j<=k)
                {
                     if(is_overflow)
                     {
                           tmp2[j] = (tmp1[j] -'0') + (tmp2[j] -'0') + 1 + '0';               //tmp1和tmp2 按位相加, 并存放在tmp2数组中
                           is_overflow = 0;
                     }
                     else
                           tmp2[j] = (tmp1[j] - '0') + (tmp2[j]-'0') + '0';                    //tmp1和tmp2 按位相加, 并存放在tmp2数组中

                     if(tmp2[j] > '9')//such as 7+ 8 = 15                                    //数据溢出处理
                     {
                           tmp2[j] = ((tmp2[j]-'0')%10) + '0';
                           is_overflow = 1;
                     }
                      j++;
                }
                if(is_overflow)
                   tmp2[j] = '1';
                ps--;
                count *= 16;
                memset(tmp1, 0, sizeof(tmp1)-1);
                k = 0;
                i = j = x = 0;
                is_overflow = 0;
        }

        get_result(tmp2, result); // 把tmp2中的数据 倒置, 就得到所求的十进制数字
        printf("result:");
        printf_array(result);
        printf("\n");
        return 0;
}                
分享代码, 快乐无限~
hulongchuan 2014-08-06
  • 打赏
  • 举报
回复
经过不懈研究,终有所成!以下为源代码,草草写的,


#include <stdio.h>
#include <string.h>


int judge_value(char c)
{
        int x;

        if(c >= '0' && c <= '9')
                x = c - '0';
        else if(c >= 'A' && c <= 'F')
                x = c - 'A' + 10;
        else if(c >= 'a' && c <= 'f')
                x = c - 'a' + 10;
        else
        {
                printf("charactor error!\n");
                return -1;
        }

        return x;
}

void printf_array(char a[])
{
    int i = 0;
    while(a[i] != '\0')
        printf("%c", a[i++]);
}

char * get_result(char *res, char *dest)
{
    char *pres = res;
    char *pdest = dest;
    if(res == NULL || *res == '\0')
    {
        perror("NULL  parameter");
        return NULL;
    }
    while(*pres)
       pres++;

    pres--;
    while(pres >= res)
    {
        if(*pres == '0')
        {
            pres--;
        }
        else
            break;
    }
    while(pres >= res)
    {
        *pdest++ = *pres--;
    }

    return dest;
}
int main()
{
        char tmp1[64] = "0";
        char tmp2[64] = "0";
        char result[64] = "\0";
        //char *s = "ABCDEF456789123";
        char s[64] = {};
        char *ps , *pr = result;

        long count = 1, i = 0;
        int x = 0, k = 0, j = 0, is_overflow = 0;
 
        gets(s);
        ps = s;
        while(*ps)
                ps++;

        ps--;


        memset(tmp1, '0', sizeof(tmp1)-1);
        tmp1[255] = '\0';
        memset(tmp2, '0', sizeof(tmp2)-1);
        tmp2[255] = '\0';
        while(ps >= s)
        {
                x = judge_value(*ps);   //字符‘1’ 转换成 1
                i = x * count;
                do
                {
                     if(i/10 > 0)
                         tmp1[k++] = i%10+'0';
                     else if(i/10 == 0)
                     {
                         tmp1[k] = i+'0';
                         break;
                     }
                }while((i=i/10) > 0);     //把算得的数按位存放在tmp1数组中

 

                while(j<=k)
                {
                     if(is_overflow)
                     {
                           tmp2[j] = (tmp1[j] -'0') + (tmp2[j] -'0') + 1 + '0';               //tmp1和tmp2 按位相加, 并存放在tmp2数组中
                           is_overflow = 0;
                     }
                     else
                           tmp2[j] = (tmp1[j] - '0') + (tmp2[j]-'0') + '0';                    //tmp1和tmp2 按位相加, 并存放在tmp2数组中

                     if(tmp2[j] > '9')//such as 7+ 8 = 15                                    //数据溢出处理
                     {
                           tmp2[j] = ((tmp2[j]-'0')%10) + '0';
                           is_overflow = 1;
                     }
                      j++;
                }
                if(is_overflow)
                   tmp2[j] = '1';
                ps--;
                count *= 16;
                memset(tmp1, 0, sizeof(tmp1)-1);
                k = 0;
                i = j = x = 0;
                is_overflow = 0;
        }

        get_result(tmp2, result); // 把tmp2中的数据 倒置, 就得到所求的十进制数字
        printf("result:");
        printf_array(result);
        printf("\n");
        return 0;
}                
分享代码, 快乐无限~
707wk 2014-08-05
  • 打赏
  • 举报
回复
只能路过了。。。
我看你有戏 2014-08-05
  • 打赏
  • 举报
回复
工作小工具,16进制,RGB,IP转换,ASCII 给你个开源代码,自己去看下,很多转换
  • 打赏
  • 举报
回复
引用 8 楼 hulongchuan 的回复:
[quote=引用 6 楼 zjq9931 的回复:] [quote=引用 5 楼 hulongchuan 的回复:] [quote=引用 4 楼 zjq9931 的回复:] [quote=引用 3 楼 hulongchuan 的回复:] [quote=引用 2 楼 zjq9931 的回复:] 加权系数法。可以搞定一切进制,转换成10进制。
这个怎么实现啊?能给个具体代码吗?第一次听说这个方法呢,不明觉厉啊~[/quote] 好吧,每当我祭出“加权系数法”,这个词的时候,就可以唬住一些人。。。 公式就是: x*m^(n-1)+y*m^(n-2)+z*m^(n-3) x,y,z代表的是3个数字,假设这个数字有3位,即:xyz m代表进制,可以是10进制,8进制,2进制,16进制,等等。 n代表位数。xyz这个数字是3位数,最高位的m^(n-1),称为权。这个就是进制转换公式。 当然,最终还是要想办法解决“大数”的。[/quote] 这个公式我知道,这个公式只能解决小数据, 如果大数据的话就不行了, 比如C中long类型最大了,如果加的和超过了long的类型范围, 是没法处理的![/quote] CSDN下载区,有一个大数的类,可供使用。 还有就是,完全可以用数组,每个元素当成数字的一位。这样用就可以了。[/quote] 恩, 我觉得也是用数组实现, 但是不知道怎么处理, 思路卡在加和后的数据 怎么存?[/quote] 模拟手动计算来做吧,效率可能有些低,但踏实。别的也想不到。
hulongchuan 2014-08-04
  • 打赏
  • 举报
回复
引用 6 楼 zjq9931 的回复:
[quote=引用 5 楼 hulongchuan 的回复:] [quote=引用 4 楼 zjq9931 的回复:] [quote=引用 3 楼 hulongchuan 的回复:] [quote=引用 2 楼 zjq9931 的回复:] 加权系数法。可以搞定一切进制,转换成10进制。
这个怎么实现啊?能给个具体代码吗?第一次听说这个方法呢,不明觉厉啊~[/quote] 好吧,每当我祭出“加权系数法”,这个词的时候,就可以唬住一些人。。。 公式就是: x*m^(n-1)+y*m^(n-2)+z*m^(n-3) x,y,z代表的是3个数字,假设这个数字有3位,即:xyz m代表进制,可以是10进制,8进制,2进制,16进制,等等。 n代表位数。xyz这个数字是3位数,最高位的m^(n-1),称为权。这个就是进制转换公式。 当然,最终还是要想办法解决“大数”的。[/quote] 这个公式我知道,这个公式只能解决小数据, 如果大数据的话就不行了, 比如C中long类型最大了,如果加的和超过了long的类型范围, 是没法处理的![/quote] CSDN下载区,有一个大数的类,可供使用。 还有就是,完全可以用数组,每个元素当成数字的一位。这样用就可以了。[/quote] 恩, 我觉得也是用数组实现, 但是不知道怎么处理, 思路卡在加和后的数据 怎么存?
赵4老师 2014-08-04
  • 打赏
  • 举报
回复
#include <iostream>
#include <string>
using namespace std;
inline int compare(string str1,string str2) {//相等返回0,大于返回1,小于返回-1
         if (str1.size()>str2.size()) return 1; //长度长的整数大于长度小的整数
    else if (str1.size()<str2.size()) return -1;
    else                              return str1.compare(str2); //若长度相等,则头到尾按位比较
}
string SUB_INT(string str1,string str2);
string ADD_INT(string str1,string str2) {//高精度加法
    int sign=1; //sign 为符号位
    string str;
    if (str1[0]=='-') {
        if (str2[0]=='-') {
            sign=-1;
            str=ADD_INT(str1.erase(0,1),str2.erase(0,1));
        } else {
            str=SUB_INT(str2,str1.erase(0,1));
        }
    } else {
        if (str2[0]=='-') {
            str=SUB_INT(str1,str2.erase(0,1));
        } else { //把两个整数对齐,短整数前面加0补齐
            string::size_type L1,L2;
            int i;
            L1=str1.size();
            L2=str2.size();
            if (L1<L2) {
                for (i=1;i<=L2-L1;i++) str1="0"+str1;
            } else {
                for (i=1;i<=L1-L2;i++) str2="0"+str2;
            }
            int int1=0,int2=0; //int2 记录进位
            for (i=str1.size()-1;i>=0;i--) {
                int1=(int(str1[i])-'0'+int(str2[i])-'0'+int2)%10;
                int2=(int(str1[i])-'0'+int(str2[i])-'0'+int2)/10;
                str=char(int1+'0')+str;
            }
            if (int2!=0) str=char(int2+'0')+str;
        }
    }
    //运算后处理符号位
    if ((sign==-1)&&(str[0]!='0')) str="-"+str;
    return str;
}
string SUB_INT(string str1,string str2) {//高精度减法
    int sign=1; //sign 为符号位
    string str;
    int i,j;
    if (str2[0]=='-') {
        str=ADD_INT(str1,str2.erase(0,1));
    } else {
        int res=compare(str1,str2);
        if (res==0) return "0";
        if (res<0) {
            sign=-1;
            string temp =str1;
            str1=str2;
            str2=temp;
        }
        string::size_type tempint;
        tempint=str1.size()-str2.size();
        for (i=str2.size()-1;i>=0;i--) {
            if (str1[i+tempint]<str2[i]) {
                j=1;
                while (1) {//zhao4zhong1添加
                    if (str1[i+tempint-j]=='0') {
                        str1[i+tempint-j]='9';
                        j++;
                    } else {
                        str1[i+tempint-j]=char(int(str1[i+tempint-j])-1);
                        break;
                    }
                }
                str=char(str1[i+tempint]-str2[i]+':')+str;
            } else {
                str=char(str1[i+tempint]-str2[i]+'0')+str;
            }
        }
        for (i=tempint-1;i>=0;i--) str=str1[i]+str;
    }
    //去除结果中多余的前导0
    str.erase(0,str.find_first_not_of('0'));
    if (str.empty()) str="0";
    if ((sign==-1) && (str[0]!='0')) str ="-"+str;
    return str;
}
string MUL_INT(string str1,string str2) {//高精度乘法
    int sign=1; //sign 为符号位
    string str;
    if (str1[0]=='-') {
        sign*=-1;
        str1 =str1.erase(0,1);
    }
    if (str2[0]=='-') {
        sign*=-1;
        str2 =str2.erase(0,1);
    }
    int i,j;
    string::size_type L1,L2;
    L1=str1.size();
    L2=str2.size();
    for (i=L2-1;i>=0;i--) { //模拟手工乘法竖式
        string tempstr;
        int int1=0,int2=0,int3=int(str2[i])-'0';
        if (int3!=0) {
            for (j=1;j<=(int)(L2-1-i);j++) tempstr="0"+tempstr;
            for (j=L1-1;j>=0;j--) {
                int1=(int3*(int(str1[j])-'0')+int2)%10;
                int2=(int3*(int(str1[j])-'0')+int2)/10;
                tempstr=char(int1+'0')+tempstr;
            }
            if (int2!=0) tempstr=char(int2+'0')+tempstr;
        }
        str=ADD_INT(str,tempstr);
    }
    //去除结果中的前导0
    str.erase(0,str.find_first_not_of('0'));
    if (str.empty()) str="0";
    if ((sign==-1) && (str[0]!='0')) str="-"+str;
    return str;
}
string DIVIDE_INT(string str1,string str2,int flag) {//高精度除法。flag==1时,返回商; flag==0时,返回余数
    string quotient,residue; //定义商和余数
    int sign1=1,sign2=1;
    if (str2 == "0") {  //判断除数是否为0
        quotient= "ERROR!";
        residue = "ERROR!";
        if (flag==1) return quotient;
        else         return residue ;
    }
    if (str1=="0") { //判断被除数是否为0
        quotient="0";
        residue ="0";
    }
    if (str1[0]=='-') {
        str1   = str1.erase(0,1);
        sign1 *= -1;
        sign2  = -1;
    }
    if (str2[0]=='-') {
        str2   = str2.erase(0,1);
        sign1 *= -1;
    }
    int res=compare(str1,str2);
    if (res<0) {
        quotient="0";
        residue =str1;
    } else if (res == 0) {
        quotient="1";
        residue ="0";
    } else {
        string::size_type L1,L2;
        L1=str1.size();
        L2=str2.size();
        string tempstr;
        tempstr.append(str1,0,L2-1);
        for (int i=L2-1;i<L1;i++) { //模拟手工除法竖式
            tempstr=tempstr+str1[i];
            tempstr.erase(0,tempstr.find_first_not_of('0'));//zhao4zhong1添加
            if (tempstr.empty()) tempstr="0";//zhao4zhong1添加
            for (char ch='9';ch>='0';ch--) { //试商
                string str;
                str=str+ch;
                if (compare(MUL_INT(str2,str),tempstr)<=0) {
                    quotient=quotient+ch;
                    tempstr =SUB_INT(tempstr,MUL_INT(str2,str));
                    break;
                }
            }
        }
        residue=tempstr;
    }
    //去除结果中的前导0
    quotient.erase(0,quotient.find_first_not_of('0'));
    if (quotient.empty()) quotient="0";
    if ((sign1==-1)&&(quotient[0]!='0')) quotient="-"+quotient;
    if ((sign2==-1)&&(residue [0]!='0')) residue ="-"+residue ;
    if (flag==1) return quotient;
    else         return residue ;
}
string DIV_INT(string str1,string str2) {//高精度除法,返回商
    return DIVIDE_INT(str1,str2,1);
}
string MOD_INT(string str1,string str2) {//高精度除法,返回余数
    return DIVIDE_INT(str1,str2,0);
}
int main() {
    char ch;
    string s1,s2,res;

    while (cin>>s1>>ch>>s2) {
        switch (ch) {
            case '+':res=ADD_INT(s1,s2);break;
            case '-':res=SUB_INT(s1,s2);break;
            case '*':res=MUL_INT(s1,s2);break;
            case '/':res=DIV_INT(s1,s2);break;
            case '%':res=MOD_INT(s1,s2);break;
            default :                   break;
        }
        cout<<res<<endl;
    }
    return(0);
}
  • 打赏
  • 举报
回复
引用 5 楼 hulongchuan 的回复:
[quote=引用 4 楼 zjq9931 的回复:] [quote=引用 3 楼 hulongchuan 的回复:] [quote=引用 2 楼 zjq9931 的回复:] 加权系数法。可以搞定一切进制,转换成10进制。
这个怎么实现啊?能给个具体代码吗?第一次听说这个方法呢,不明觉厉啊~[/quote] 好吧,每当我祭出“加权系数法”,这个词的时候,就可以唬住一些人。。。 公式就是: x*m^(n-1)+y*m^(n-2)+z*m^(n-3) x,y,z代表的是3个数字,假设这个数字有3位,即:xyz m代表进制,可以是10进制,8进制,2进制,16进制,等等。 n代表位数。xyz这个数字是3位数,最高位的m^(n-1),称为权。这个就是进制转换公式。 当然,最终还是要想办法解决“大数”的。[/quote] 这个公式我知道,这个公式只能解决小数据, 如果大数据的话就不行了, 比如C中long类型最大了,如果加的和超过了long的类型范围, 是没法处理的![/quote] CSDN下载区,有一个大数的类,可供使用。 还有就是,完全可以用数组,每个元素当成数字的一位。这样用就可以了。
hulongchuan 2014-08-04
  • 打赏
  • 举报
回复
引用 4 楼 zjq9931 的回复:
[quote=引用 3 楼 hulongchuan 的回复:] [quote=引用 2 楼 zjq9931 的回复:] 加权系数法。可以搞定一切进制,转换成10进制。
这个怎么实现啊?能给个具体代码吗?第一次听说这个方法呢,不明觉厉啊~[/quote] 好吧,每当我祭出“加权系数法”,这个词的时候,就可以唬住一些人。。。 公式就是: x*m^(n-1)+y*m^(n-2)+z*m^(n-3) x,y,z代表的是3个数字,假设这个数字有3位,即:xyz m代表进制,可以是10进制,8进制,2进制,16进制,等等。 n代表位数。xyz这个数字是3位数,最高位的m^(n-1),称为权。这个就是进制转换公式。 当然,最终还是要想办法解决“大数”的。[/quote] 这个公式我知道,这个公式只能解决小数据, 如果大数据的话就不行了, 比如C中long类型最大了,如果加的和超过了long的类型范围, 是没法处理的!
  • 打赏
  • 举报
回复
引用 3 楼 hulongchuan 的回复:
[quote=引用 2 楼 zjq9931 的回复:] 加权系数法。可以搞定一切进制,转换成10进制。
这个怎么实现啊?能给个具体代码吗?第一次听说这个方法呢,不明觉厉啊~[/quote] 好吧,每当我祭出“加权系数法”,这个词的时候,就可以唬住一些人。。。 公式就是: x*m^(n-1)+y*m^(n-2)+z*m^(n-3) x,y,z代表的是3个数字,假设这个数字有3位,即:xyz m代表进制,可以是10进制,8进制,2进制,16进制,等等。 n代表位数。xyz这个数字是3位数,最高位的m^(n-1),称为权。这个就是进制转换公式。 当然,最终还是要想办法解决“大数”的。
hulongchuan 2014-08-04
  • 打赏
  • 举报
回复
引用 2 楼 zjq9931 的回复:
加权系数法。可以搞定一切进制,转换成10进制。
这个怎么实现啊?能给个具体代码吗?第一次听说这个方法呢,不明觉厉啊~
  • 打赏
  • 举报
回复
加权系数法。可以搞定一切进制,转换成10进制。
ouyh12345 2014-08-04
  • 打赏
  • 举报
回复
搜索下大数字 可以用字符串来表示数据 用栈做转换

70,023

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧