洛谷p1017 进制转换(2000noip提高组)
洛谷P1017 进制转换
题意分析
给出一个数n,要求用负R进制显示。
n∈[-32768,32767]。R ∈[-20,-2]
考察的是负进制数的转换,需要理解短除法。
看到这道题的时候,我是比较蒙圈的。随手拿短除法试了试,但是发现结果不对。最明显的原因,一个数对一个负数取模,结果可能是一个负数。
联想一下在做进制转化的时候,实在不断地做【除】和【取余】的操作。取余直接是取的余数,在做除法的时候,其实是有一个向下取整的过程。如:
我们对125做短除法,余数为1时,125/2=72.5。实际写的时候写的是72。也可以理解为,已经把余数拿出来,其实是124/2=72.
刚才说在对负数取模后结果可能是一个负数,解决负数的方法,就是在取模结果减去进制数(进制是负数),这样就能变成正数。但是别忘了,数字本身要减1,类似于对正数进制的下取整操作。
代码总览
#include <bits/stdc++.h>
#define nmax 10000
using namespace std;
char ans[30] = "0123456789ABCDEFGHIJKLM" ;
int main()
{
int n,dig;
while(scanf("%d %d",&n,&dig) != EOF){
vector<char> v;
int num = n;
while(n != 0){
int temp = n % dig;
n /= dig;
if(temp < 0){
temp -= dig;
n++;
}
v.push_back(ans[temp]);
}
printf("%d=",num);
for(int i = v.size()-1;i>=0;--i){
printf("%c",v[i]);
}
printf("(base%d)\n",dig);
}
return 0;
}