【NOIP2000】进制转换
本题在洛谷上的链接:https://www.luogu.org/problemnew/show/P1017
进制转换大致可分为R进制转10进制和10进制转R进制。
一、R进制转10进制:
这个比较简单,可以直接套公式。
就是将R进制数转化为若干形如a*R^(i-1)的式子之和(a为R进制数当前位上的数,i为当前位)。
举个栗子,100(2进制)=1*2^2+0*2^1+0*2^0=4。
二、10进制转R进制:
1、R为正整数:
只要N(要转换的10进制数)不为0,就对R取模,并更新为除以R的商,将所得余数逆序打印即可。
举个栗子,4(10进制)转为100(2进制):
4/2=2...0
2/2=1...0
1/2=0...1
将余数逆序输出,可得100.
2、R为负整数:
处理方法等同于R为正整数的做法,但不同的是,由于对R取模的商一定在[0,|R|)之间,所以当余数为负数时,应进行相关处理。也就是让余数加上|R|,再将商加1。
另外,10进制的小数转R进制,相对较容易,将小数部分乘R再取整,不断重复,顺序输出取整结果即可,然而现在并不会当R是负数的情况。
曾经一度以为对一个负整数取模和对一个正整数取模效果是一样的,其实不然, 可能余数一样,但商并不相同。
但就这道题而言,还需要注意N为0时,当然R规定不可以为0。
1 #include <cstdio> 2 #include <stack> 3 4 using namespace std; 5 6 stack<char> ans; 7 8 int main() { 9 int N, R, r; 10 scanf("%d%d", &N, &R); 11 printf("%d=", N); 12 while (N) { 13 r = N % R, N /= R; 14 if (r < 0) r -= R, ++N; 15 if (r <= 9) ans.push(r + '0'); 16 else ans.push(r - 10 + 'A'); 17 } 18 while (!ans.empty()) { 19 printf("%c", ans.top()); 20 ans.pop(); 21 } 22 printf("(base%d)", R); 23 return 0; 24 }