平衡进制问题/对称的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;
}
posted @ 2023-10-14 23:07  Simex  阅读(73)  评论(0编辑  收藏  举报