zoukankan      html  css  js  c++  java
  • P1017 [NOIP2000 提高组] 进制转换

    题目传送门

    一、求解步骤

    原理: 被除数=除数*商+余数
    而余数必须为大于等于(0)的数字,为负数是没法表示的,所以当余数为负数时,需要进行特殊处理。
    (-15 % -2)为例:

    cout << -15 % -2 ;   -->输出-1
    

    由此可以看出,在C++的运算出来(-15 % -2=-1),表示(-15= -2 * 7 -1) 余数是(-1)

    但是,末位=-1 不行啊,余数不能是负的,需要再借一个(2)过来,加一个(2),才能把余数转正.
    (-15= (-2 * 7 - 2) + (-1 + 2))
    (-15= -2 * (7+1) + 1)
    借一个(2)过来后,发生了两件事,
    (1)原来的被借的数字需要再减去一个(2),而余数可以加上这个(2).变成(-1+2=1)

    (2)但向上一位借了一个 (2),被借数就小了一个(2),就是需要多减(1)(2)!!!多减(1)个!!多减(1)个!
    多了(1)个,这里多了(1)个就是 被除数=(-15),除数=(-2),余数=(1),那么 “商”=(8),也就是,原来的商由(7)就成了(8)
    就是商加了(1)

    二、完整代码

    #include <bits/stdc++.h>
    
    using namespace std;
    const int N = 110;
    int n, r;
    int a[N], idx;
    
    /**
    测试数据:
    -15 -2
    
     
    结果 110001
    */
    int main() {
        cin >> n >> r;
        cout << n << "=";
        //数位分离
        while (n) {
            a[idx] = n % r;  //余数
            n /= r;          //商
            if (a[idx] < 0) {    //余数不能是负的,如果是负的,需要借位
                a[idx] += (-r);  //借位增加(-r)
                n++;             //商++
            }
            idx++;
        }
        //倒序
        for (int i = idx - 1; i >= 0; i--)
            if (a[i] >= 10)
                printf("%c", (char) ('A' + a[i] - 10));
            else printf("%d", a[i]);
    
        cout << "(base" << r << ")";
        return 0;
    }
    
  • 相关阅读:
    【洛谷 P4721】【模板】—分治FFT(CDQ分治+NTT)
    【Comet OJ】模拟赛测试 Day2题解
    【Comet OJ】模拟赛测试 Day2题解
    将本地文件夹push到github仓库
    2017-3-7
    彻底理解https!
    2017-3-2 智慧吉首调研工作
    java再巩固
    2017-3-1
    不错的博客哦
  • 原文地址:https://www.cnblogs.com/littlehb/p/15171877.html
Copyright © 2011-2022 走看看