WHCSRL 技术网

【C++】进制转换

相信在这节课开始之前,很多同学们早就对进制和进制转换比较熟悉了。我们本节课先通过一个利用栈来实现进制转换的例子,带大家再深入的学习下进制和进制转换。

例题1:将一个十进制数n转换为二进制数。

解题思路:十进制数转换成二进制数,可以采用辗转相除、取余数的方法得到。例如十进制数11转换成二进制。先求余数11%%2=1,求商11/2=5,然后再用商5再求其余数,求其商,直到商为0,结束。

11%%2=1   11/2=5   5%%2=1   5/2=2
2%%2=0    2/2=1    1%%2=1   1/2=0

先求出的余数是二进制数的低位,后求出的余数是二进制的高位,将得到的余数逆序输出就是所需要的二进制数,即11的二进制数为1011.如何将余数逆序输出呢?逆序输出正好符合栈的先进后出的性质,因此可以借助栈来实现(其实事实上我们一般更喜欢采用数组来解决进制转换类的问题)。

算法步骤:(1)先初始化一个栈s;(2)如果n!=0,将n%%2入栈s,更新n=n/2;(3)重复运行第二步,直到n=0结束;(4)如果栈不空,弹出栈顶元素e,输出e,直到栈空。具体代码,请自行补充完整。

通过上面的例子,我相信大家对进制和进制转换都有了一个大致的了解,那么接下来我们再详细的学习下进制和进制转换相关方面的知识。


1.什么是进制

进制的全称是进位计数制,是人为定义的带进位的计数方法,对于任何一种进制--X 进制,就表示每一位置上的数运算时都是逢 X进一位。 十进制是逢十进一,十六进制是逢十六进一,二进制就是逢二进一,以此类推,X进制就是逢X进位。

十进制

十进制共有10个数码{0,1,2,3,4,5,6,7,8,9},它的特点是逢 10进1。

img

常见进制表示方法:二进制:B 八进制:Q 十进制:D 十六进制:H

二进制转十进制:按权展开后相加,下面是几个示例

img

十进制转二进制:方法:整数部分除基(2)取余,倒序排列;小数部分乘基(2)取整, 正序排列。

例题:将十进制数 28 转换为二进制数

img

例题:将十进制数 16.6875 转换为二进制数

img

八进制

八进制共有8个数码{0,1,2,3,4,5,6,7},它的特点是逢 8进1。

八进制转十进制:按权展开后相加,下面是几个示例

img

十进制转八进制方法:整数部分除基(8)取余,倒序排列;小数部分乘基(8)取整, 正序排列。

img

八进制与二进制转换方法:三分法(想一想为什么可以用这种方法)

img

十六进制

十六进制共有16个数码{0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F},它的特点是逢 16进1。

十六进制转十进制:按权展开后相加,下面是几个示例

img

十六进制与二进制转换:方法:四分法(想一想为什么可以用这种方法)

img

相信通过上面的介绍,同学们已经对什么是二进制、八进制、十进制以及十六进制已经了如指掌了吧。那么接下来再让我们如何利用C++进行进制之间的转换吧。


例题1:请你编写一个程序,将八进制数转换成十进制数。

解题思路:首先利用数位分离分离出每一位数字,然后i从1开始累乘,每次乘8即可。完整的代码如下,除此之外,你还能想到几种其它的代码吗?

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int fun(int x)
  4. {
  5. int i=1,sum=0;
  6. while(x!=0)
  7. {
  8. sum=sum+(x%%10)*i;
  9. x=x/10;
  10. i=i*8;
  11. }
  12. return sum;
  13. }
  14. int main()
  15. {
  16. int x;
  17. cin>>x;
  18. cout<<fun(x)<<endl;
  19. }

例题2:请你编写一个程序,将十进制数转换成八进制数。

解题思路:首先利用将x对8取余,每次模的结果放在一个数组里面,同时x每次更新为x/8,最后只要逆序输出数组里面的数字就可以了。完整的代码如下,除此之外,你还能想到几种其它的代码?

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int main()
  4. {
  5. int n=0,x,a[100];
  6. cin>>x;
  7. while(x!=0)
  8. {
  9. n++;
  10. a[n]=x%%8;
  11. x=x/8;
  12. }
  13. for(int i=n;i>=1;i--)
  14. cout<<a[i];
  15. return 0;
  16. }

例题3:输入一个b进制的数字a,将其转换成对应的十进制数字(在int范围内)。

样例输入:共一行,为两个数字,第一个为数字a,第二个为进制b;

样例输出:为一个数字,表示对应的十进制数字

样例输入1:

101 2

 样例输出1:

5

 解题思路:将数字存在字符串里,从后往前遍历整个字符串,因为可能是16进制会有ABCDEF,因此需要对a[i]进行判断,如果是a[i]>='A'则t=a[i]-65+10,否则t=a[i]-48。然后将t乘上b的k次方就可以了,k从0开始每次加1。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int main( )
  4. {
  5. string a; //将数字存在字符串里
  6. int b,i,s=0,k=0,t;
  7. cin>>a>>b; //输入这个数和进制
  8. for(i=a.size()-1;i>=0;i--) //从后往前
  9. {
  10. t=(a[i]>='A'?a[i]-65+10:a[i]-48); //因为可能是16进制会有ABCDEF,因此需要对a[i]进行判断,如果是a[i]>='A'则t=a[i]-65+10,否则t=a[i]-48。
  11. s=s+t*pow(b,k); //pow函数的用法,表示b的k次方
  12. k++; //k+1,你懂的
  13. }
  14. cout<<s;
  15. }

例题4:输入一个十进制的数字a,将其转换成对应的b进制数字(在int范围内)。

样例输入:共一行,为两个数字,第一个为数字a,第二个为进制b;

样例输出:为一个数字,表示对应的十进制数字

样例输入1:

101 8

 样例输出1:

145

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int main( )
  4. {
  5. int a,b;
  6. string c; //c是字符串
  7. cin>>a>>b;
  8. while(a!=0)
  9. {
  10. char t=a%%b+48; //t是字符型,把数字存进字符串里加48
  11. if(t>'9') //这里是字符’9’,考虑16进制
  12. {
  13. t=64+t-'9'; //如果超过9,转换成字母ABCDEF
  14. }
  15. c=c+t; //字符串拼接
  16. a=a/b; //更新a的值
  17. }
  18. reverse(c.begin(),c.end()); //逆序输出即可
  19. cout<<c;
  20. }

例题5:输入一个b进制的数字s,将其转换成对应的c进制数字(在int范围内)。

样例输入:共一行,为三个数字,第一个为数字a,第二个为当前进制b,第三个为待转化进制c

样例输出:为一个数字,表示对应的c进制数字

样例输入1:

101 10 8

样例输出1:

145

解题思路:先转成十进制,再从十进制转为其他进制。本题是进制转换章节最重要的一题,因为只要会了这一题,可以解决任何进制之间的转换问题,因此希望同学一定要熟练掌握。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int _zhuan10(string a,int b)
  4. {
  5. int i,s=0,k=0,t;
  6. for(i=a.size()-1;i>=0;i--)
  7. {
  8. t=(a[i]>='A'?a[i]-65+10:a[i]-48);
  9. s=s+t*pow(b,k);
  10. k++;
  11. }
  12. return s;
  13. }
  14. string _10zhuan(int a,int b)
  15. {
  16. string c;
  17. while(a!=0)
  18. {
  19. char t=a%%b+48;
  20. if(t>'9')
  21. {
  22. t=64+t-'9';
  23. }
  24. c=c+t;
  25. a=a/b;
  26. }
  27. reverse(c.begin(),c.end());
  28. return c;
  29. }
  30. int main( )
  31. {
  32. string a;
  33. int b,c;
  34. cin>>a>>b>>c;
  35. int t=_zhuan10(a,b);
  36. cout<<_10zhuan(t,c);
  37. }

请转载时附上出处:https://blog.csdn.net/shenben1010/article/details/121068434