进制转换
计算机所能识别的是二进制数,而我们在实际生活中使用的是十进制数。那么在运算过程中,需要进行进制转换。由于二进制位数太多,为了计算和存储的方便,我们引入了八进制和十六进制数。
【程序1】十进制转换成二进制
输入一个十进制数,将其转换成二进制数输出。
样例输入: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 15
0 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;
else
s=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);
else
ans+=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然后按不同的进制将它们转换成成十进制数,判断是否相等。
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;
}