ACM模版

描述

题解

这个题让我更加深刻的认识到了取模与取余……

以前总是以为取模就是取余,取余就是取模,谁成想原来这两个竟然不一样,而不一样的地方主要是体现在对负整数的除法运算有些许差异。

经过查阅资料发现,不论是取余还是取模,都涉及到两个过程( r=a%b ):
1、求整数商: c=a/b
2、计算模或者余数: r=acb
在取余过程中,求 c 时是向 0 方向舍入(fix()函数),而取模是向负无穷方向舍入(floor()函数)。
总而言之,当 a 和 b 符号一致时,求模和求余运算所得的 c 值是一样的,所以结果是一致的;当 a 和 b 符号不一致时,求模运算的结果和 b 保持一致,求余运算的结果和 a 保持一致。对于求余来说,还可以更简单的看,不管 b 符号如何,总是和 a 符号保持一致。
另外呢,根据编译环境不同,对 % 运算的定义也不同,C/C++、Java定义为取余,而 Python 定义为取模……

代码

#include <iostream>
#include <cstdio>
#include <stack>

using namespace std;

stack<char> sc;

int main()
{
    int N, b;
    scanf("%d%d",&N, &b);

    int a = N;
    if (-b <= 9)
    {
        while (a)
        {
            if (a % b >= 0)
            {
                sc.push('0' + a % b);
                a /= b;
            }
            else
            {
                sc.push('0' + a % b - b);
                a = a / b + 1;
            }
        }
    }
    else
    {
        while (a)
        {
            if (a % b >= 0)
            {
                if (a % b <= 9)
                {
                    sc.push('0' + a % b);
                }
                else
                {
                    sc.push('A' + (a % b - 10));
                }
                a /= b;
            }
            else
            {
                if (a % b - b <= 9)
                {
                    sc.push('0' + a % b - b);
                }
                else
                {
                    sc.push('A' + a % b - b - 10);
                }
                a = a / b + 1;
            }
        }
    }

    printf("%d=", N);
    while (!sc.empty())
    {
        a = sc.top();
        sc.pop();
        putchar(a);
    }
    printf("(base%d)\n", b);

    return 0;
}