华师一附中OI组

标题: P1017 进制转换 [打印本页]

作者: 倚窗倾听风吹雨    时间: 2018-8-20 11:22
标题: P1017 进制转换
https://www.luogu.org/problemnew/show/P1017

进制转换
【题目描述】
    我们可以用这样的方式来表示一个十进制数:将每个阿拉伯数字乘以一个以该数字所处位置的(值减1)为指数,以10为底数的幂之和的形式。例如:123可表示为 1*102+2*101+3*100这样的形式。
     与之相似的,对二进制数来说,也可表示成每个二进制数码乘以一个以该数字所处位置的(值-1)为指数,以2为底数的幂之和的形式。一般说来,任何一个正整数R或一个负整数-R都可以被选来作为一个数制系统的基数。如果是以R或-R为基数,则需要用到的数码为 0,1,……,R-1。例如,当R=7时,所需用到的数码是0,1,2,3,4,5和6,这与其是R或-R无关。如果作为基数的数绝对值超过10,则为了表示这些数码,通常使用英文字母来表示那些大于9的数码。例如对16进制数来说,用A表示10,用B表示11,用C表示12,用D表示13,用E表示14,用F表示15。
在负进制数中是用-R 作为基数,例如-15(十进制)相当于110001(-2进制),并且它可以被表示为2的幂级数的和数:
   110001=1*(-2)5+1*(-2)4+0*(-2)3+0*(-2)2+0*(-2)1+1*(-2)0
    设计一个程序,读入一个十进制数和一个负进制数的基数,并将此十进制数转换为此负进制下的数:    -R∈{-2,-3,-4,……,-20} 
【输入】
  输入文件只有一行,有两个输入数据。
  第一个是十进制数n(-109<=n<=109);  第二个是负进制数的基数-R。
【输出】
输出格式如样例输出n=n’,其中n为十进制下表示,n’为负进制下表示。
【输入输出样例】
输入1                             输出1
30000 -2                           30000=11011010101110000(base-2)
输入2                             输出2
-20000 -2                        -20000=1111011000100000(base-2)
输入3                             输出3
28800 -16                         28800=19180(base-16)
输入4                             输出4
-25000 -16                       -25000=7FB8(base-16)
【数据约定】
  对于30%的数据,|n|<=1000,2<=R<=10
    对于70%的数据,|n|<=32767, 2<=R<=20
    对于100%的数据,|n|<=1092<=R<=20



作者: 倚窗倾听风吹雨    时间: 2018-8-20 11:22
  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. using namespace std;
  5. int n,r,k,sum;
  6. int ans[100];
  7. string b="0123456789ABCDEFGHIJ";
  8. int main()
  9. {
  10. ///    freopen("scale.in","r",stdin);
  11. ///    freopen("scale.out","w",stdout);
  12.     cin>>n>>r;
  13.     cout<<n<<"=";
  14.     while (n)
  15.     {
  16.         k=n%r;
  17.         if (k<0) k-=r;
  18.         ans[++sum]=k;
  19.         n=(n-k)/r;
  20.     }
  21.     for (int i=sum;i>=1;i--) cout<<b[ans[i]];
  22.     cout<<"(base"<<r<<")";
  23.     return 0;
  24. }
复制代码

作者: universehyf    时间: 2018-11-24 20:38
  1. #include<iostream>
  2. #include<cstdio>
  3. using namespace std;
  4. typedef long long ll;
  5. #define FOR(i,a,b) for(register ll i=a;i<=b;++i)
  6. int n,r;
  7. void dg(int x)
  8. {
  9.     if(x==0) return;
  10.     int k=x%r;
  11.     if(k<0) k-=r,x+=r;
  12.     dg(x/r);
  13.     if(k>9) cout<<char(k-10+'A');
  14.     else cout<<k;
  15. }
  16. int main()
  17. {
  18.     cin>>n>>r;
  19.     cout<<n<<'=';
  20.     dg(n);
  21.     cout<<"(base"<<r<<')';
  22.     return 0;
  23. }
复制代码





欢迎光临 华师一附中OI组 (http://hsyit.cn/) Powered by Discuz! X3.2