进制转换
来源:互联网 发布:淘宝直通车手机端位置 编辑:程序博客网 时间:2024/05/22 03:47
进制转换
计算机所能识别的是二进制数,而我们在实际生活中使用的是十进制数。那么在运算过程中,需要进行进制转换。由于二进制位数太多,为了计算和存储的方便,我们引入了八进制和十六进制数。【程序1】十进制转换成二进制
输入一个十进制数,将其转换成二进制数输出。
样例输入:23
样例输出:10111
【分析】十进制转换成二进制采用“除2取余”的方法,具体的计算过程如下:
如果十进制数n很大,最后转换成的二进制数可能有几十位,甚至更多,所以转换成的二进制数不适合用整数表示,最好用字符串存储。参考程序如下:
样例输入:23
样例输出:10111
【分析】十进制转换成二进制采用“除2取余”的方法,具体的计算过程如下:
如果十进制数n很大,最后转换成的二进制数可能有几十位,甚至更多,所以转换成的二进制数不适合用整数表示,最好用字符串存储。参考程序如下:
C++ code:#include<iostream>#include<string>using namespace std;int main(){int n;string s;cin >> n;s="";while(n>0){s=char(n % 2 + 48) + s;n/=2;}cout << s << endl;}
【程序2】输入一个十进制数n,转换成k(2≤k≤30)进制数。
输入两个整数n和k,输出转换后的k进制数。样例输入1: 23 2样例输出1: 10111样例输入2: 159 16样例输出2: 9F【分析】 和转换成二进制数一样,采用“除k取余”法,将2换成k即可。 不过从十进制开始,数位10用字符"A"表示,以此类推。对于十六进制,对应如下: ----------------------------------------------0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 150 1 2 3 4 5 6 7 8 9 A B C D E F ---------------------------------------------- 所以,(159)10=(9F)16 对于大于等于10的余数,转换成对应的大写字母。
c++ code:#include<iostream>#include<string>using namespace std;int main(){int n,k;string s;cin >> n >> k;s="";while(n>0){if(n % k >= 10) s=char(n % k + 55) + s;elses=char(n % k + 48) + s;n/=k;}cout << s << endl;}
【程序3】输入一个二进制数,转换成十进制数。
样例输入:10111 样例输出:23【分析】 二进制转换成十进制采用按位权展开相加。例如:
c++ code:#include<iostream>#include<string>using namespace std;int main(){int ans=0,t=1,i;string s;cin >> s;for(int i=s.size()-1;i>=0;i--){ans+=t*(int(s[i])-48);t*=2;}cout << ans << endl;}
【程序4】输入一个k进制数n,转换成十进制数。
输入: k n输出: 转换后的十进制数。样例输入1: 2 10111样例输出1: 23样例输入2: 16 9F样例输出2: 159
c++ code:#include<iostream>#include<string>using namespace std;int main(){int k,ans=0,t=1,i;string s;cin >> k;cin >> s;for(int i=s.size()-1;i>=0;i--){if(s[i]>='A' && s[i]<='Z')ans+=t*(int(s[i])-55);elseans+=t*(int(s[i])-48);t*=k;}cout << ans << endl;}
【程序5】二进制小数
解题思路:
对于实数小数部分,转换成二进制,我们采用乘以2取整数的方法。如:
整数部分 0.149 × 2 ———— 0.298 ... 0 × 2 ———— 0.596 ... 0 × 2 ———— 1.192 ... 1 0.192 × 2 ———— 0.384 ... 0 × 2 ———— 0.768 ... 0 × 2 ———— 1.536 ... 1所以十进制数0.149转换成二进制数为0.001001(保留6位小数)
c++ code:#include<iostream>#include<cmath>using namespace std;int main(){ double n; int m,ans; cin >> n >> m; n -= floor(n); for (int i = 0; i < m; ++i) { ans=floor(n*2); n=n*2-floor(n*2); } cout << ans << endl;}
【程序6】确定进制
问题描述
6*9=42 对于十进制来说是错误的,但是对于13进制来说是正确的。即, 6(13) * 9(13) = 42(13), 而 42(13) = 4 * 131 + 2 * 130 = 54(10)。 你的任务是写一段程序读入三个整数 p、q和 r,然后确定一个进制 B(2<=B<=16) 使得 p * q = r. 如果 B有很多选择, 输出最小的一个。例如: p = 11, q = 11, r = 121. 则有
11(3) * 11(3) = 121(3) 因为 11(3) = 1 * 31 + 1 * 30 = 4(10)
121(3) = 1 * 32 + 2 * 31 + 1 * 30 = 16(10)。
对于进制10,有 11(10) * 11(10) = 121(10)。这种情况下,应该输出 3。如果没有合适的进制,则输出 0。
输入数据
一行,包含三个整数 p、q、r。 p、q、r的所有位都是数字,并且 1 ≤ p、q、r ≤ 1,000,00。
输出要求
一行。该行包含一个整数:即使得 p * q = r成立的最小的 B。如果没有合适的 B,则输出 0。
输入样例1
6 9 42
输出样例1
13
输入样例2
11 11 121
输出样例2
3
输入样例3
2 2 2
输出样例3
0
问题分析:
此问题很简单。选择一个进制 B,按照该进制将被乘数、乘数、乘积分别转换成十进制然后判断等式是否成立。使得等式成立的最小 B 就是所求的结果。
分别用一个字符型数组存储 p、q、r的各位数字符号。先以字符串的方式读入 p、q、r然后按不同的进制将它们转换成成十进制数,判断是否相等。
6*9=42 对于十进制来说是错误的,但是对于13进制来说是正确的。即, 6(13) * 9(13) = 42(13), 而 42(13) = 4 * 131 + 2 * 130 = 54(10)。 你的任务是写一段程序读入三个整数 p、q和 r,然后确定一个进制 B(2<=B<=16) 使得 p * q = r. 如果 B有很多选择, 输出最小的一个。例如: p = 11, q = 11, r = 121. 则有
11(3) * 11(3) = 121(3) 因为 11(3) = 1 * 31 + 1 * 30 = 4(10)
121(3) = 1 * 32 + 2 * 31 + 1 * 30 = 16(10)。
对于进制10,有 11(10) * 11(10) = 121(10)。这种情况下,应该输出 3。如果没有合适的进制,则输出 0。
输入数据
一行,包含三个整数 p、q、r。 p、q、r的所有位都是数字,并且 1 ≤ p、q、r ≤ 1,000,00。
输出要求
一行。该行包含一个整数:即使得 p * q = r成立的最小的 B。如果没有合适的 B,则输出 0。
输入样例1
6 9 42
输出样例1
13
输入样例2
11 11 121
输出样例2
3
输入样例3
2 2 2
输出样例3
0
问题分析:
此问题很简单。选择一个进制 B,按照该进制将被乘数、乘数、乘积分别转换成十进制然后判断等式是否成立。使得等式成立的最小 B 就是所求的结果。
分别用一个字符型数组存储 p、q、r的各位数字符号。先以字符串的方式读入 p、q、r然后按不同的进制将它们转换成成十进制数,判断是否相等。
C++ code:#include<iostream>#include<string>using namespace std;int shi(string s,int k){ //将k进制数s转换成十进制数int t=1,he=0;for(int i=s.size()-1;i>=0;i--){ if(s[i]>='A' && s[i]<='Z') he+=(int(s[i])-55)*t; else he+=(int(s[i])-48)*t; t*=k;}return he;}int main(){string s1,s2,s;int i,j=0,k;cin >> s1 >> s2 >> s;char ch=s1[0];for(i=1;i<s1.size();i++) if(s1[i]>ch) ch=s1[i];for(i=0;i<s2.size();i++) if(s2[i]>ch) ch=s2[i];for(i=0;i<s.size();i++) if(s[i]>ch) ch=s[i];if(ch>='A' && ch<='Z') k=int(ch)-55; //找出这个式子最少是k+1进制数 else k=int(ch)-48;for(i=k+1;i<=16;i++) //枚举可能的每个进制 if(shi(s1,i) * shi(s2,i) == shi(s,i)){cout << i << endl;j=1;break; }if(j==0) cout << 0 << endl;}
0 1
- 进制转换,类型转换
- 进制转换(进制转换)
- 进制转换-----十进制转换成二进制
- 进制的转换,八进制转换十六进制
- 进制转换,运算符,类型转换,
- 十进制转换2-9进制转换
- 进制转换
- 无限进制转换
- 进制转换
- 进制转换
- 进制转换
- 【整理】进制转换
- 进制转换
- 七、进制转换
- 进制转换
- 进制转换
- 进制转换
- NotesScript 进制转换
- QT 传输图片出现数据缺失
- jQuery.map() 函数详解
- CUDA之编程中线程分配的数组在register中还是local memory中?
- 扫描台操作以及集合框架
- Java并发编程-并发工具包java.util.concurrent使用指南
- 进制转换
- jqueryMobile手机开发
- 1001. 害死人不偿命的(3n+1)猜想 (15)
- JavaScript与Android原生相互调用并传参
- Tomcat8启用gzip压缩实现网页性能优化
- 提高篇——用c语言将十进制数转换尾二进制数
- Linux预习
- 购物车功能实现
- Hive的安装