1. 程式人生 > 實用技巧 >P1017 進位制轉換

P1017 進位制轉換

題目描述
我們可以用這樣的方式來表示一個十進位制數: 將每個阿拉伯數字乘以一個以該數字所處位置為指數,以 1010 為底數的冪之和的形式。例如 123123 可表示為 1 \times 10^2+2\times 10^1+3\times 10^01×10
2
+2×10
1
+3×10
0
這樣的形式。

與之相似的,對二進位制數來說,也可表示成每個二進位制數碼乘以一個以該數字所處位置為指數,以 22 為底數的冪之和的形式。

一般說來,任何一個正整數 RR 或一個負整數 -R−R 都可以被選來作為一個數制系統的基數。如果是以 RR 或 -R−R 為基數,則需要用到的數碼為 0,1,....R-10,1,....R−1。

例如當 R=7R=7 時,所需用到的數碼是 0,1,2,3,4,5,60,1,2,3,4,5,6,這與其是 RR 或 -R−R 無關。如果作為基數的數絕對值超過 1010,則為了表示這些數碼,通常使用英文字母來表示那些大於 99 的數碼。例如對 1616 進位制數來說,用 AA 表示 1010,用 BB 表示 1111,用 CC 表示 1212,以此類推。

在負進位制數中是用 -R−R 作為基數,例如 -15−15(十進位制)相當於 110001110001 (-2−2進位制),並且它可以被表示為 22 的冪級數的和數:

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
110001=1×(−2)
5
+1×(−2)
4
+0×(−2)
3
+0×(−2)
2
+0×(−2)
1
+1×(−2)
0

設計一個程式,讀入一個十進位制數和一個負進位制數的基數, 並將此十進位制數轉換為此負進位制下的數。

輸入格式
輸入的每行有兩個輸入資料。

第一個是十進位制數 nn。 第二個是負進位制數的基數 -R−R。

輸出格式
輸出此負進位制數及其基數,若此基數超過 1010,則參照 1616 進位制的方式處理。

輸入輸出樣例
輸入 #1複製
30000 -2
輸出 #1複製
30000=11011010101110000(base-2)
輸入 #2複製
-20000 -2
輸出 #2複製
-20000=1111011000100000(base-2)
輸入 #3複製
28800 -16
輸出 #3複製
28800=19180(base-16)
輸入 #4複製
-25000 -16
輸出 #4複製
-25000=7FB8(base-16)
說明/提示
【資料範圍】
對於 100%100% 的資料,-20 \le R \le -2−20≤R≤−2,|n| \le 37336∣n∣≤37336。

NOIp2000提高組第一題

#include<cstdio>
#define _for(i, a, b) for(int i = (a); i <= (b); i++)
using namespace std;

void cal(int n, int m)
{
	if(n == 0) return;
	int p = n % m;
	n /= m;
	if(p < 0) p -= m, n++;
	cal(n, m);
	if(p <= 9) printf("%d", p);
	else printf("%c", p - 10 + 'A');
}

int main()
{
	int n, m;
	scanf("%d%d", &n, &m);
	printf("%d=", n);
	cal(n, m);
	printf("(base%d)\n", m);
	return 0;
}