描述
题解
这个题让我更加深刻的认识到了取模与取余……
以前总是以为取模就是取余,取余就是取模,谁成想原来这两个竟然不一样,而不一样的地方主要是体现在对负整数的除法运算有些许差异。
经过查阅资料发现,不论是取余还是取模,都涉及到两个过程( r=a%b ):
1、求整数商: c=a/b
2、计算模或者余数: r=a−c∗b
在取余过程中,求 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;
}