user-0 提问: C 十六进制转换成十进制数字的问题

回复:
user: user-1
content: 12楼代码如果不使用固定长度的数组，改用malloc、realloc、free动态长度的数组就更完美了。

user: user-2
content: 支持！！ 引用 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; }                  分享代码， 快乐无限~

user: user-0
content: 经过不懈研究，终有所成！以下为源代码，草草写的，   #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; }                  分享代码， 快乐无限~

user: user-3
content: 只能路过了。。。

user: user-4
content: 工作小工具，16进制，RGB,IP转换,ASCII 给你个开源代码，自己去看下，很多转换

user: user-2
content: 引用 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] 模拟手动计算来做吧，效率可能有些低，但踏实。别的也想不到。

user: user-0
content: 引用 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] 恩， 我觉得也是用数组实现， 但是不知道怎么处理， 思路卡在加和后的数据 怎么存？

user: user-1
content: #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); }

user: user-2
content: 引用 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下载区，有一个大数的类，可供使用。 还有就是，完全可以用数组，每个元素当成数字的一位。这样用就可以了。

user: user-0
content: 引用 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的类型范围， 是没法处理的！

user: user-2
content: 引用 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)，称为权。这个就是进制转换公式。 当然，最终还是要想办法解决“大数”的。

user: user-0
content: 引用 2 楼 zjq9931 的回复:加权系数法。可以搞定一切进制，转换成10进制。 这个怎么实现啊？能给个具体代码吗？第一次听说这个方法呢，不明觉厉啊~

user: user-2
content: 加权系数法。可以搞定一切进制，转换成10进制。

user: user-5
content: 搜索下大数字 可以用字符串来表示数据 用栈做转换