十六进制转十进制

博客探讨了两种将十六进制数值65535转换为十进制的方法,一种内存使用少但代码较长,另一种代码较短但内存使用较多。
问题描述
  从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出。
  注:十六进制数中的10~15分别用大写的英文字母A、B、C、D、E、F表示。
样例输入
FFFF
样例输出

65535


第一种方法:


这个代码虽长,但内存使用较少:

详细记录
评测点序号 评测结果 得分 CPU使用 内存使用 下载评测数据
1 正确 25.00 0ms 836.0KB 输入 输出
2 正确 25.00 0ms 836.0KB 输入 输出
3 正确 25.00 0ms 836.0KB 输入 输出
4 正确 25.00 0ms 836.0KB 输入 输出


源代码
1
int main(void)
2
{
3
  char Hex[8];
4
  char str[33];
5
  int len;
6
  int i=0;
7
  int j=0;
8
  unsigned int res;
9
  int base;
10
  scanf("%s",Hex);
11
  len = strlen(Hex);
12
  while(Hex[i]!='\0')
13
  {
14
    switch(Hex[i])
15
    {
16
    case 'A':
17
      strcpy(&str[j],"1010");
18
      i++;
19
      j+=4;
20
    break;
21
    case 'B':
22
      strcpy(&str[j],"1011");
23
      i++;
24
      j+=4;
25
    break;
26
    case 'C':
27
      strcpy(&str[j],"1100");
28
      i++;
29
      j+=4;
30
    break;
31
    case 'D':
32
      strcpy(&str[j],"1101");
33
      i++;
34
      j+=4;
35
    break;
36
    case 'E':
37
      strcpy(&str[j],"1110");
38
      j+=4;
39
      i++;
40
    break;
41
    case 'F':
42
      strcpy(&str[j],"1111");
43
      j+=4;
44
      i++;
45
    break;
46
    case '0':
47
      strcpy(&str[j],"0000");
48
      j+=4;
49
      i++;
50
    break;
51
    case '1':
52
      strcpy(&str[j],"0001");
53
      j+=4;
54
      i++;
55
    break;
56
    case '2':
57
      strcpy(&str[j],"0010");
58
      j+=4;
59
      i++;
60
    break;
61
    case '3':
62
      strcpy(&str[j],"0011");
63
      j+=4;
64
      i++;
65
    break;
66
    case '4':
67
      strcpy(&str[j],"0100");
68
      j+=4;
69
      i++;
70
    break;
71
    case '5':
72
      strcpy(&str[j],"0101");
73
      j+=4;
74
      i++;
75
    break;
76
    case '6':
77
      strcpy(&str[j],"0110");
78
      j+=4;
79
      i++;
80
    break;
81
    case '7':
82
      strcpy(&str[j],"0111");
83
      j+=4;
84
      i++;
85
    break;
86
    case '8':
87
      strcpy(&str[j],"1000");
88
      j+=4;
89
      i++;
90
    break;
91
    case '9':
92
      strcpy(&str[j],"1001");
93
      j+=4;
94
      i++;
95
    break;
96
  }
97
}
98
  base = --j;
99
  while(j>=0)
100
  {
101
    int temp;
102
    temp = str[j]-'0';
103
    res += temp*pow(2,base-j);
104
    j--;
105
  }
106
  printf("%u\n",res);
107
  
108
  return 0;
109
}
第二种方法:

这个代码稍微短一些,但内存使用较多

详细记录
评测点序号评测结果得分CPU使用内存使用下载评测数据
1正确25.000ms2.496MB输入 输出
2正确25.000ms2.496MB输入 输出
3正确25.000ms2.496MB输入 输出
4正确25.000ms2.5MB输入 输出

源代码
1
#include <iostream>
2
using namespace std;
3
int main()
4
{
5
     char hex_num[9];
6
     cin>>hex_num;
7
     int l;    //十六进制数长度 
8
     long long dnum=0;
9
    for(l=0;hex_num[l]!='\0';l++);
10
     for(int i=l-1;i>=0;i--){    //位权展开法 
11
         int num;
12
         long long weights=1;    //权值 
13
         if('0'<=hex_num[i] && hex_num[i]<='9')
14
             num=hex_num[i]-'0';
15
         else if('A'<=hex_num[i] && hex_num[i]<='F')
16
             num=hex_num[i]-'A'+10;
17
         for(int j=l-i;j>1;j--)
18
             weights*=16;
19
         dnum+=num*weights;
20
     }
21
     cout<<dnum<<endl;
22
     return 0;
23
 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值