2007年3月30日星期五

C++ 除号(/)和取余(%)操作符 vs 负数

当C++ 除号(/)和取余(%)操作符遇到负数的时候,就会有奇异的事情发生……
如果两个操作数为正,除法和取模操作的操作的结果也是正数(或零);如果两个操作数都为负数,除法的操作的结果也为正数(或零),而求模操作的结果则为负数(或零);如果只有一个操作数为负,这两种操作的结果取决于机器;求模结果的符号也取决于机器,而除法操作的值则是负数(或零):

C++ Primer中文第四版130页

底下有几个例子,略去了。大概是说,21%-5可以等于1或-4,21/-5可以等于-4或-5。
在gcc(Linux版,Windows应该也一样)下试了一下:
21%-5=1
21/-5=-4
就是说,取余操作的符号取决于分子,结果向零一侧取整,除法的结果直接把小数截去。
USACO上一个题(Broken Necklace)需要mod函数,他是这样解决的:
/*
* Return n mod m. The C % operator is not enough because
* its behavior is undefined on negative numbers.
*/
int
mod(int n, int m)
{
while(n < 0)
n += m;
return n%m;
}

begin

在这里写下OI过程中的点点滴滴……