#T0082. 负进制转换

0

负进制转换

题目描述

日常生活中我们使用十进制计数,而计算机内部常用二进制。事实上,进制的基数并不一定是正数。当基数 RR 为负数时,同样可以用“除基取余”的方法表示任意整数,而且有一个神奇的性质:负进制表示负数时不需要负号,每一个整数在给定的负基数下都有唯一的不带负号的表示。

给定一个整数 NN 和一个基数 RR,请你输出 NNRR 进制表示。

数码规定如下:

  • 数值 090\sim 9 用字符 09 表示;
  • 数值 101510\sim 15 用大写字母 AF 表示。

输出的表示结果中不允许出现负号;当 N=0N=0 时输出一个字符 0

输入格式

一行,两个整数 NNRR,用空格分隔。其中 RR 一定是负数。

输出格式

一行,一个字符串,表示 NNRR 进制表示。

样例输入1

-15 -2

样例输出1

110001

样例输入2

-2147483648 -16

样例输出2

80000000

数据范围与约定

  • 2147483648N2147483647-2147483648 \le N \le 2147483647
  • 16R2-16 \le R \le -2

提示

C++ 中整数除法向零取整,当被除数 NN 为负时,余数 r=NmodRr=N\bmod R 也会是负数。若 r<0r<0,进行如下修正即可保证余数落在 0r<R0\le r<|R| 内:

  • rr+Rr \leftarrow r + |R|(即 rrRr \leftarrow r-R
  • qq+1q \leftarrow q + 1

修正后仍然满足 N=qR+rN = qR + r。反复除基直到商为 00,把余数倒序输出即可。注意 2147483648-2147483648 超出 32 位有符号整数的正数范围,请使用 long long