进制转换

来源:互联网 发布:淘宝直通车手机端位置 编辑:程序博客网 时间:2024/05/22 03:47
进制转换
        计算机所能识别的是二进制数,而我们在实际生活中使用的是十进制数。那么在运算过程中,需要进行进制转换。由于二进制位数太多,为了计算和存储的方便,我们引入了八进制和十六进制数。
【程序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 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然后按不同的进制将它们转换成成十进制数,判断是否相等。
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
原创粉丝点击