【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 }
AC代码
原文地址:https://www.cnblogs.com/Mr94Kevin/p/7428254.html