P1017 进制转换(负进制&数论)

题目传送门

题意:给一个整数和基数,要求转化以该基数的该进制。

思路:题目主要难度为:余数可能是负数,因为转化为该进制表示时是用余数的倒序,由于除数(为负数)的绝对值比余数的绝对值大,所以用余数减去一个除数,商再加上一个除数即可以保证余数为正,且结果不变。

#include<bits/stdc++.h>
using namespace std;
void fun(int n,int r){
	if(n==0) return;
	int m=n%r;
	if(m<0) m-=r,n+=r;
	if(m>=10) m='A'+m-10;//这里m是ASCII码 
	else  m=m+'0';
	fun(n/r,r);
	printf("%c",m); 
}
int main(){
	int n,r;
	cin>>n>>r;
	printf("%d=",n);
	fun(n,r);
	printf("(base%d)\n",r);
	return 0;
}