平衡進制問題/對稱的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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章