进制转换
来自《算法笔记》
给自己一句话:坚持到底,总会看到光明!
思考:对于两个不同进制,应该如何进行相互转换?
不要想着一步就位,要有一个桥梁——十进制
对于一个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 }