进制转换

来自《算法笔记》


给自己一句话:坚持到底,总会看到光明!

思考:对于两个不同进制,应该如何进行相互转换?

不要想着一步就位,要有一个桥梁——十进制

对于一个P进制数,如果要转换为Q进制,需要分为两步

  将P进制数x转换为十进制数y.。

  对于一个十进制数y=d1d2..dn,它可以写成这个形式:

       y=d1*10^n-1+d2*10^n-2+...+dn-1*10+dn

那么类比一下,如果P进制数x为a1a2a3..an,那么它写成下面这个形式之后使用十进制的加法和乘法,就可以转换为十进制数y:

    y=a1*P^(n-1)+a2*P^(n-2)+...+a^(n-1)*P+an

 

转换为十进制数后

将十进制数y转换为Q进制数z

采用“除基取余法” 所谓的“基”:将要转换成的进制Q。

是什么意思:

举个例子:

将十进制数11转换为二进制数

11 /2 =5    11%2=1   此时余数1应当为其最高位

5/2=2  5%2=1 此时余数1位次高位

2/2=1  2%2=0 此时这一位为0

1/2=0 1%2=1 余数为1 此时为最低位

因此转化成的二进制数为1011

从上面的例子中很容易看出是一个循环,停止条件是商为0 的时候

 

void ten2P(int ten,int P){//st是用来存P进制的每一位
     int num=0;
     do{//除基取余法
         st.push(ten%P);
         ten=ten/P;
     }while(ten);
 }

//在插入代码之前我解释一下为什么用do-while();循环

  如果十进制数y恰好等于0,如果用while()将会使循环直接跳出,导致结果出错!(正确结果应当是栈st中存放st[0]=0)

代码如下:

 1 #include <iostream>
 2 #include<stack>
 3 /* run this program using the console pauser or add your own getch, system("pause") or input loop */
 4 using namespace std;
 5 //p进制转十进制
 6 
 7 int p2ten(int x,int P){
 8     int y=0;
 9     int product=1;//product 在循环中会不断的乘p得到 1、p、p^2、p^3、、、
10     while(x){
11         y+=(x%10)*product;//x%10是为了每次获取 x的个位数
12         x/=10;
13         product=product*P; 
14     } 
15     return y;
16 } 
17 
18 //十进制转P进制
19 stack<int> st;
20 void ten2P(int ten,int P){//st是用来存P进制的每一位 
21     int num=0;
22     do{//除基取余法 
23         st.push(ten%P); 
24         ten=ten/P; 
25     }while(ten);
26 } 
27 
28 int main(int argc, char** argv) {
29     
30     int ten;//十进制 
31     int Q;//Q进制
32     int x;//p进制所在下的x 
33     int n;
34     int num; 
35     cout<<"\n=========================\n"<<"\n不能用于16进制\n输入1表示将十进制转换为Q进制\n输入2表示将Q进制转化为十进制\n输入0表示结束\n"<<"\n=========================\n"<<endl;
36     cin>>n; 
37     while(n){
38         if(n==1){
39             cout<<"\n请输入十进制数:"<<endl;
40             cin>>ten;
41             cout<<"\n请输入您需要转换的进制数"<<endl;
42             cin>>Q; 
43             ten2P(ten,Q); 
44             cout<<ten<<"转换成"<<Q<<"进制数为:"<<endl;
45             while(!st.empty()){
46                 num=st.top();
47                 if(Q==16){
48                     if(num>=10)
49                         cout<<(char)((num-10)+'A');
50                     else
51                         cout<<num; 
52                 }else{
53                     cout<<num;
54                 }
55                 
56                 st.pop();
57             }
58         }else{
59             cout<<"\n请输入您的数所在的进制:\n"<<endl;
60             cin>>Q;
61             cout<<"\n请输入数:"<<endl;
62             cin>>x;
63         
64             cout<<Q<<"进制转化成十进制为:"<<p2ten(x,Q)<<endl;
65             
66         }
67         cout<<"\n\n\n是否继续?[0表示结束]\n\n";
68         cin>>n;
69     }
70     return 0;
71 }