进制转换

进制转换

        计算机所能识别的是二进制数,而我们在实际生活中使用的是十进制数。那么在运算过程中,需要进行进制转换。由于二进制位数太多,为了计算和存储的方便,我们引入了八进制和十六进制数。

【程序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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值