SP2055 CERC07N - Weird Numbers
题目描述
二进制数是计算机科学的基础。许多人可能还听说过三进制、八进制或十六进制等其他进制系统,并了解如何在它们之间进行数值转换。但你是否知道基数(进制)还可以是负数?捷克技术大学的一位助理教授最近接触到负二进制数以及其他负基数的系统。你愿意帮助他在这些系统之间进行数值转换吗?
在一个正基数 $R$ 的系统中,一个数字 $N$ 会由介于 $0$ 至 $R-1$ 之间的数字组成。当将其从右到左编号,每个位置 $P$ 上的数字实际上表示 $R^P$ 值的倍数。比如,用八进制系统(基数 $R=8$)表示的数字 $17024$,其计算方法如下:
$$1 \cdot 8^4 + 7 \cdot 8^3 + 0 \cdot 8^2 + 2 \cdot 8^1 + 4 \cdot 8^0 = 7700$$
对于负基数 $-R$ 来说,这一原理仍然适用:每个数字对应的值变为 $(-R)^P$。例如,负八进制(基数 $R=-8$)数字 $17024$ 的计算方法是:
$$1 \cdot (-8)^4 + 7 \cdot (-8)^3 + 0 \cdot (-8)^2 + 2 \cdot (-8)^1 + 4 \cdot (-8)^0 = 500$$
负基数系统的一个显著优势是表示负数时不需要再用减号。以下是几个负二进制系统($R=-2$)的示例:
| 十进制 | 负二进制 | 十进制 | 负二进制 | 十进制 | 负二进制 |
|--------|----------|--------|----------|--------|----------|
| -10 | 1010 | -3 | 1101 | 4 | 100 |
| -9 | 1011 | -2 | 10 | 5 | 101 |
| -8 | 1000 | -1 | 11 | 6 | 11010 |
| -7 | 1001 | 0 | 0 | 7 | 11011 |
| -6 | 1110 | 1 | 1 | 8 | 11000 |
| -5 | 1111 | 2 | 110 | 9 | 11001 |
| -4 | 1100 | 3 | 111 | 10 | 11110 |
你可以发现,如果不允许“前导零”,任何整数的负二进制表示都是唯一的。唯一可以由“0”开头的数字是零自身。
输入格式
输入包含若干行,每行表示一次转换请求。从十进制系统转换到某个负基数系统的请求以小写字母“to”开头,紧随其后的是负号(无空格),接着是需要转换的基数 $R$,一个空格和一个十进制数 $N$。
从负基数系统转换到十进制系统的请求以小写字母“from”开头,后面跟着负号和基数 $R$,一个空格,加上使用基数 $-R$ 表示的数字。
输入以小写字母“end”结束。所有数值将满足:$2 \le R \le 10$,$-1\,000\,000 \le N \le 1\,000\,000$(十进制)。
输出格式
对于每个转换请求,单独输出一行结果。如果输入使用十进制格式,则输出在基数 $-R$ 系统下的表示;若输入的是负基数系统中的数字,则输出其对应的十进制值。
输出结果中的数字不得有前导零。减号“-”只能出现在十进制的负数前。非负数或负基数系统中的数字不能以此开头。
**本翻译由 AI 自动生成**