• 【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代码
  • 相关阅读:
    计算机网络精华知识总结01
    使用hexo创建github博客
    Android Toolbar样式定制详解
    我的PhoneGap安装配置经历
    APMServ5.2.6升级PHP
    WordPress网站更换老鹰主机详细操作
    Windows下的SVN环境搭建详解
    最新Android 出现Please ensure that adb is correctly located at问题的解决方法
    QSqlDatabase
    Qt Pro相关
  • 原文地址:https://www.cnblogs.com/Mr94Kevin/p/7428254.html
Copyright © 2020-2023  润新知