0020:[NOIP2000 提高组] 进制转换

题目链接:https://www.luogu.com.cn/problem/P1017

题目描述:读入一个十进制数和一个负进制数的基数, 并将此十进制数转换为此负进制下的数

可能有人和我一样在做这道题时遇到了麻烦,因为对负进制很陌生。

就拿题目中给的例子来说  -15=1×(2)^5+1×(2)^4+0×(2)^3+0×(2)^2+0×(2)^1+1×(2)^0=110001

可以看到负数在偶次方时是正数,这就可以进行正数和负进制的转换。

那么,如果取模的时候遇到负数怎么办?

很简单,将此负数减去进制,在将输入的十进制数减去进制即可。

代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 void Q(int n,int r){
 4     if(n==0){
 5         return;
 6     }
 7     int m=n%r;
 8     if(m<0){//负数时的操作 
 9         m-=r;
10         n+=r;
11     }
12     if(m>=10){//m直接转ascll码 
13         m=m-10+'A';
14     }else{
15         m=m+'0';
16     }    
17     Q(n/r,r);//递归 
18     cout<<char(m);//倒序输出,在递归后面输出 
19 }
20 int main(){
21     int n,r;
22     cin>>n>>r;
23     cout<<n<<"=";
24     Q(n,r);
25     cout<<"(base"<<r<<")";
26 }

 

posted @ 2022-07-27 09:25  uf0_金币灰黄^w.h  阅读(55)  评论(0)    收藏  举报