定義平衡\(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;
}