华师一附中OI组

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1069|回复: 2
打印 上一主题 下一主题

P1017 进制转换

[复制链接]

50

主题

215

帖子

619

积分

高级会员

Rank: 4

积分
619
跳转到指定楼层
楼主
发表于 2018-8-20 11:22:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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


回复

使用道具 举报

50

主题

215

帖子

619

积分

高级会员

Rank: 4

积分
619
沙发
 楼主| 发表于 2018-8-20 11:22:39 | 只看该作者
  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. }
复制代码
回复 支持 反对

使用道具 举报

14

主题

106

帖子

317

积分

中级会员

Rank: 3Rank: 3

积分
317
板凳
发表于 2018-11-24 20:38:54 | 只看该作者
  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. }
复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|服务支持:DZ动力|华师一附中OI组  

GMT+8, 2024-11-2 00:30 , Processed in 0.128570 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表