平衡进制问题/对称的2k+1进制问题
定义平衡\(2k+1\)进制数码为\(-k,-(k-1),,,0,,,k-1,k\),请求出一个十进制数的\(2k+1\)进制表示。
对于该问题,解决的思路是首先算出普通的\(2k+1\)进制下的表示,然后分别对每一位进行考虑.
1:这一位的数属于 \(0-k\)
不用管
2:这一位的数属于\(k+1-2k\)
设此数等于 \(k+p\) ,则将下一位加1,然后这一位变成 \(-k-1+p\)
可以证明,使用该规则进行变换的答案是正确的。
对于负数进制问题,只要将每一位都取反即可得到相反数。
#include<stdio.h>
int n,k;
int f;
int m;
int l;
int num[1000];
void print(int i){
if(i>=0) printf("%d",i);
else printf("%c",(-i-1)+'A');
}
int main(){
scanf("%d%d",&n,&k);
if(n==0) printf("0");
if(n<0) {
f=1;
n=-n;
}
m=2*k+1;
while(n){
num[++l]=n%m;
n/=m;
}
for(int i=1;i<=l;++i){
if(num[i]>k){
num[i+1]++;
num[i]=-k-1+(num[i]-k);
}
}
if(f) for(int i=1;i<=l+1;++i) num[i]=-num[i];
if(num[l+1]!=0) print(num[l+1]);
for(int i=l;i>=1;--i) print(num[i]);
return 0;
}