將正整數n轉換成進製r的數。其中比較棘手的情況是基數r是負數的情況,因為這時用一般的取模運算,得到的的數碼範圍是[(r+1),0]。但規定此時的數碼依然是非負數。
例如:-16的-2進製表示可以作以下運算:
− 16=
1∗(−
2)5+
1∗(−
2)
4-16=1*(-2)^5+1*(-2)^4
−16=1∗
(−2)
5+1∗
(−2)
4即-16的-2進製表示為:11 0000
輸入:輸入的每行有兩個輸入資料。首先要了解到c++裡的 % 運算子的計算方法:r=m%n 是用第乙個是十進位制數 n。 第二個是負進製數的基數 -r。
輸出:輸出此負進製數及其基數,若此基數超過 10,則參照 16 進製的方式處理。
輸入輸出例項:輸入 30000 -2 輸出 30000=11011010101110000(base-2)
r =m
−(m/
n)∗n
[1
]r= m- (m/n)*n [1]
r=m−(m
/n)∗
n[1]
得到的,注意m/n為整除法。
可以看出:* 如果m是負數,那麼r也一定是負數 *
還是用上面的-16作為例子,如果-16的-2進製按上面的[1]式計算,最後得到的結果是:(-1)0000,這時候的數碼顯然是不符合要求的。
分析運算過程,如果第i位的數碼ri為負,(i從0開始算,是基數的次數)此時i一定為偶數。要得到非負數的數碼,需要 1*ri+1去加上 |ri|*ri,因為i是偶數,ri+1是負的,運算得到的結果是一樣的。
總結:設m/n=q(整除), r=m%n
有(q+1)*n+(r-n)=q*n+n+r-n=q*n+r=m
這個時候的r一定是正的。
#includeusing namespace std;
void convert(int n, int r);
char charac[20]=; //用於大於10進製的輸出,由於最大是20進製,所以就開到20個
int main()
cin>>n>>r;
cout<9)
cout
cout<}
P1017 進製轉換
我們可以用這樣的方式來表示乙個十進位制數 將每個阿拉伯數字乘以乙個以該數字所處位置的 值減1 為指數,以10為底數的冪之和的形式。例如 123可表示為 1 102 2 101 3 1001 times 10 2 2 times 10 1 3 times 10 01 102 2 10 1 3 100 ...
P1017 進製轉換
題目描述 我們可以用這樣的方式來表示乙個十進位制數 將每個阿拉伯數字乘以乙個以該數字所處位置的 值減11 為指數,以1010為底數的冪之和的形式。例如 123123可表示為 1 times 10 2 2 times 10 1 3 times 10 01 10 2 2 10 1 3 10 0這樣的形式...
P1017 進製轉換
我們可以用這樣的方式來表示乙個十進位制數 將每個阿拉伯數字乘以乙個以該數字所處位置的 值減11 為指數,以1010為底數的冪之和的形式。例如 123123可表示為 1 times 10 2 2 times 10 1 3 times 10 01 102 2 101 3 100這樣的形式。與之相似的,對...