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 }

浙公网安备 33010602011771号