傳送門
我們可以用這樣的方式來表示乙個十進位制數: 將每個阿拉伯數字乘以乙個以該數字所處位置為指數,以 \(10\) 為底數的冪之和的形式。例如 \(123\) 可表示為 \(1 \times 10^2+2\times 10^1+3\times 10^0\) 這樣的形式。
與之相似的,對二進位制數來說,也可表示成每個二進位制數碼乘以乙個以該數字所處位置為指數,以 \(2\) 為底數的冪之和的形式。
一般說來,任何乙個正整數 \(r\) 或乙個負整數 \(-r\) 都可以被選來作為乙個數制系統的基數。如果是以 \(r\) 或 \(-r\) 為基數,則需要用到的數碼為 \(0,1,....r-1\)。
例如當 \(r=7\) 時,所需用到的數碼是 \(0,1,2,3,4,5,6\),這與其是 \(r\) 或 \(-r\) 無關。如果作為基數的數絕對值超過 \(10\),則為了表示這些數碼,通常使用英文本母來表示那些大於 \(9\) 的數碼。例如對 \(16\) 進製數來說,用 \(a\) 表示 \(10\),用 \(b\) 表示 \(11\),用 \(c\) 表示 \(12\),以此類推。
在負進製數中是用 $-r $ 作為基數,例如 \(-15\)(十進位制)相當於 \(110001\) (\(-2\)進製),並且它可以被表示為 \(2\) 的冪級數的和數:
\[110001=1\times (-2)^5+1\times (-2)^4+0\times (-2)^3+0\times (-2)^2+0\times (-2)^1 +1\times (-2)^0
\]設計乙個程式,讀入乙個十進位制數和乙個負進製數的基數, 並將此十進位制數轉換為此負進製下的數。
輸入的每行有兩個輸入資料。
第乙個是十進位制數 \(n\)。 第二個是負進製數的基數 \(-r\)。
輸出此負進製數及其基數,若此基數超過 \(10\),則參照 \(16\) 進製的方式處理。
30000 -2
30000=11011010101110000(base-2)
-20000 -2
-20000=1111011000100000(base-2)
28800 -16
28800=19180(base-16)
-25000 -16
-25000=7fb8(base-16)
【資料範圍】 對於 \(100\%\) 的資料,\(-20 \le r \le -2\),\(|n| \le 37336\)。
noip2000提高組第一題
那我們咋搞呢?
我們設\(a / b = c \bmod d\),這裡有乙個非常巧妙的方法:\(c \leftarrow c + 1\),\(d \leftarrow d - b\) 。
如何證明呢?小學就學過帶餘除法公式\(a = b \times c + d\)呀,套!
\[a = b \times (c + 1) + d - b \\
a = b \times c + b + d - b \\
a = b \times c + d\]
可以看到,整個式子並不違揹帶餘除法公式。
其實這就是借1法了。
這道題倒是讓我學習到了負進製,哈哈,真的學習了。
#include #include int n,r;
void change(int k)
if(mod >= 10) mod += 'a' - 10;
else mod += '0';
change(k/r);
printf("%c",mod);
return ;
}int main()
wa 0
:r31067887(原因是沒有注意輸出格式,下次肯定注意!!!太悲劇了)
ac 100
:r31067892
洛谷1017 進製轉換
題目描述 我們可以用這樣的方式來表示乙個十進位制數 將每個阿拉伯數字乘以乙個以該數字所處位置的 值減1 為指數,以10為底數的冪之和的形式。例如 123可表示為1 10 2 2 10 1 3 10 0這樣的形式。與之相似的,對二進位制數來說,也可表示成每個二進位制數碼乘以乙個以該數字所處位置的 值 ...
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這樣的形式...