zoukankan      html  css  js  c++  java
  • 【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代码
  • 相关阅读:
    centos7.6 使用yum安装mysql5.7
    解决hadoop本地库问题
    docker-compose 启动警告
    docker 安装zabbix5.0 界面乱码问题解决
    docker 部署zabbix问题
    zookeeper 超时问题
    hbase regionserver异常宕机
    (转载)hadoop 滚动升级
    hadoop Requested data length 86483783 is longer than maximum configured RPC length
    zkfc 异常退出问题,报错Received stat error from Zookeeper. code:CONNECTIONLOSS
  • 原文地址:https://www.cnblogs.com/Mr94Kevin/p/7428254.html
Copyright © 2011-2022 走看看