题目:洛谷1017 进制转换(模拟)

题目描述:

我们可以用这样的方式来表示一个十进制数:将每个阿拉伯数字乘以一个以该数字所处位置的(值减1)为指数,
以10为底数的幂之和的形式。例如:123可表示为1*10^2+2*10^1+3*10^0这样的形式。

与之相似的,对二进制数来说,也可表示成每个二进制数码乘以一个以该数字所处位置的(值-1)为指数,
以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,用D表示13,用E表示14,用F表示15。

在负进制数中是用-R 作为基数,
例如-15(十进制)相当于110001(-2进制),并且它可以被表示为2的幂级数的和数: 
110001=1*(-2)^5+1*(-2)^4+0*(-2)^3+0*(-2)^2+0*(-2)^1 +1*(-2)^0 
设计一个程序,读入一个十进制数和一个负进制数的基数, 
并将此十进制数转换为此负进制下的数:-R∈{-2,-3,-4,…,-20} 

思路:
负进制取余过程中可能出现负数,当出现负数的时候,可以让取整的结果加1,同时让余数减去r(因为r是负的,所以减去r就是加上r的绝对值)。r整除n时余数直接就是0,r不能整除n时,分两种情况,n大于0时,余数是正的,不影响,n小于零时,余数一定是负的,所以要整数+1,余数-r。因为是倒序输出,所以要把打印放在递归的下面,在递归向上层返回的过程中再把之前的数打印出来。
代码:

#include 
#include 
using namespace std;
char str[25]={'0','1','2','3','4','5','6','7',\
			'8','9','A','B','C','D','E','F','G','H','I','J'};
void change(int n, int r)
{
	if (n==0)	return;
	if (n>0 || n%r==0){
		change(n/r, r);
		printf("%c", str[n%r]);
		return;
	}else{
		change(n/r+1, r);
		printf("%c", str[n%r-r]);
		return;
	}
}
int main()
{
	int n, r;
	cin>>n>>r;
	printf("%d=", n);
	change(n, r);
	printf("(base%d)", r);
	return 0;
} 

你可能感兴趣的:(模拟/贪心)