用C++實現:將10進制轉換為16進制


問題描述
  十六進制數是在程序設計時經常要使用到的一種整數的表示方式。它有0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F共16個符號,分別表示十進制數的0至15。十六進制的計數方法是滿16進1,所以十進制數16在十六進制中是10,而十進制的17在十六進制中是11,以此類推,十進制的30在十六進制中是1E。
  給出一個非負整數,將它表示成十六進制的形式。
輸入格式
  輸入包含一個非負整數a,表示要轉換的數。0<=a<=2147483647
輸出格式
  輸出這個整數的16進制表示
樣例輸入
30
樣例輸出
1E
 1 /*
 2   十六進制數是在程序設計時經常要使用到的一種整數的表示方式。
 3     它有0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F共16個符號
 4     分別表示十進制數的0至15。十六進制的計數方法是滿16進1
 5     所以十進制數16在十六進制中是10,而十進制的17在十六進制中是11,以此類推,十進制的30在十六進制中是1E。
 6   給出一個非負整數,將它表示成十六進制的形式。
 7     輸入包含一個非負整數a,表示要轉換的數。0<=a<=2147483647
 8 */
 9 #include<iostream>
10 using namespace std;
11 
12 char exchange_int_char(int a)      //整型轉換為字符型
13 {
14     char b;
15     switch (a)
16     {
17     case 0:b = '0'; break;
18     case 1:b = '1'; break;
19     case 2:b = '2'; break;
20     case 3:b = '3'; break;
21     case 4:b = '4'; break;
22     case 5:b = '5'; break;
23     case 6:b = '6'; break;
24     case 7:b = '7'; break;
25     case 8:b = '8'; break;
26     case 9:b = '9'; break;
27     case 10:b = 'A'; break;
28     case 11:b = 'B'; break;
29     case 12:b = 'C'; break;
30     case 13:b = 'D'; break;
31     case 14:b = 'E'; break;
32     case 15:b = 'F'; break;
33     default:break;
34     }
35     return b;
36 }
37 
38 int main(void)
39 {
40     int n,m;
41     int i = 0;
42     cin >> n;
43     char* arr = new char[9];   //2147483647轉換成16進制是7FFFFFFF,所以最高有8位,再加上最后一位'\0',所以最大要9位
44     if (n > 15)
45     {
46         while (n >= 16)
47         {
48             m = n % 16;          //m保存余數
49             n = n / 16;
50             arr[i] = exchange_int_char(m);
51             i++;
52         }
53         arr[i] = exchange_int_char(n);
54         for (int j = i; j >= 0; j--)          //倒着輸出
55         {
56             cout << arr[j];
57         }
58     }
59     else
60     {
61         arr[i] = exchange_int_char(n);
62         cout << arr[i];
63     }
64     return 0;
65 }

注意:(1):為了節省內存,首先根據可能輸入的整型最大值算出所需要的最大的數組空間,也就是位數最多的時候為8位,所以給數組分配9位

           (2):注意這里為什么要倒着輸出。根據10進制轉換16進制的機制,首先得到的余數要放在數組的最后一位,然而這里把首先得到的余數放在了數組的第一位

           (3):注意53行,這里有個坑,我自己一開始沒發現。為什么是arr[i]而不是arr[i+1]。因為第51行有個i++,本來這個i++是為了控制數組往后移動一位,然而在循環結束的時候,數組里面沒有存                        入任何數,仍然向后移動一位。如果我們在53行再去i+1的話,就相當於比原來多加了2,也就是說下一個元素是arr[i+2]而不是我們所想的arr[i+1],這個時候arr[i+1]沒有初始化,所以在最                        后結果輸出的時候會輸出亂碼。

然后再分享一個在網上看到的更簡單的方法:

參考原鏈接:https://blog.csdn.net/qq_38961856/article/details/79244387?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522158389331719725256757324%2522%252C%2522scm%2522%253A%252220140713.130056874..%2522%257D&request_id=158389331719725256757324&biz_id=0&utm_source=distribute.pc_search_result.none-task

 

 1 #include<iostream>
 2 
 3 #include<string>
 4 
 5 using namespace std;
 6 
 7 int main()
 8 
 9 {
10 
11     long a;//輸入的數
12 
13     int y=0;//循環中的余數
14 
15     string s="";//輸出的結果
16 
17     cin>>a;
18 
19     if(a==0)//0比較特殊,單獨處理
20 
21     {
22 
23     cout<<0;
24 
25     return 0;
26 
27     }
28 
29  
30 
31     while(a>0)//大於0的數
32 
33     {
34 
35         y=a%16;  //求余
36 
37         if(y<10)   //小於10的余數
38 
39         s=char('0'+y)+s;  //利用字符的ascll碼在字符串前面拼接
40 
41         else
42 
43         s=char('A'-10+y)+s;  //大於9的余數用ABCDE表示
44 
45         a=a/16;   
46 
47     }
48 
49     cout<<s;
50 
51     return 0;
52 
53 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM