在负进制数中是用 −R 作为基数,例如 −15(十进制)相当于 110001 (−2进制),并且它可以被表示为 2 的幂级数的和数:
输入格式
输入的每行有两个输入数据。
第一个是十进制数 n。 第二个是负进制数的基数 −R。
输出格式
输出此负进制数及其基数,若此基数超过 10,则参照 16 进制的方式处理。
输入输出样例
输入
30000 -2
输出
30000=11011010101110000(base-2)
输入
-25000 -16
输出
-25000=7FB8(base-16)
进制转换可以用短除法,然后将余数倒序输出。
但是余数要是正数,而C语言的运算中余数是与被除数的符号相同的,也就是说,余数有可能为负数。
我们可以这样做:如果余数是负数,余数减除数,商加1。
例如:-15 / -2 = 7 余数为 -1 所以 其商 变为7+1=8, 余数变为-1 -(-2)=1.
#include <stdio.h>
char ans[25];
int num[25];
void Change(int j)
{
int i;
for(i = 0;i < j;i++)
{
if(num[i] >= 0 && num[i] <= 9)
ans[i] = num[i] + '0';
else
ans[i] = num[i] - 10 + 'A';
}
}
int main()
{
int n,r;
scanf("%d%d",&n,&r);
printf("%d=",n);
int i = 0;
while(n)
{
if(n%r < 0)
{
num[i] = n%r - r;
n = n/r + 1;
}
else
{
num[i] = n%r;
n /= r;
}
i++;
}
Change(i);
for(int j = i-1;j >= 0;--j)
{
printf("%c",ans[j]);
}
printf("(base%d)",r);
return 0;
}