通用公式:
这三种语言中,求余的公式都是如下:
int y = a - floor(a / b) * b // 该式 等价 int y = a % b;
区别:
这三种语言的 floor 函数是不一样的,正数的时候看不出来,但是负数会导致 结果有差异。
c/c++ 中,floor() 函数是 向0取整的:
#include <stdio.h>
#include <math.h>
int main()
{
int a = floor(7 / -3);
printf("a=%d\n", a); // 结果等于 -2
int b = floor(-7 / 3);
printf("b=%d\n", b); // 结果等于 -2
int c = floor(-7 / -3);
printf("c=%d\n", c); // 结果等于 2
//带入通用公式: a % b = a - floor(a / b) * b
// 7 % -3 = 1
int x = 7 - floor(7 / -3) * -3;
printf("x=%d\n",x); // 7-(-2)*-3 = 1
// -7 % 3 = -1
int y = -7 - floor(-7 / 3) * 3;
printf("y=%d\n",y); // -7-(-2)*3 = -1
// -7 % -3 = -1
int z = -7 - floor(-7 / -3) * (-3);
printf("z=%d\n", z); // -7 - 2*(-3) = -1
return 0;
}
[注]:这里有个小技巧: 就是c/c++中, 求余的结果符号只看第一个操作数,比如上式的,-7%-3 = -7%3 = -1;(可以把a,b看成正数,计算结果后加符号)
LUA 中,floor() 函数是 向负无穷取整的:
local a = math.floor(7 / -3) -- 结果等于 -3 // -2.333 向负无穷取整 = -3
local b = math.floor(-7 / 3) -- 结果等于 -3
local c = math.floor(-7 / -3) -- 结果等于 2
-- 带入通用公式:a%b = a - floor(a / b) * b
-- 7 % -3 = -2
local x = 7 - math.floor(7 / -3) * -3
print(x) -- 7-(-3)*-3 = -2
-- -7 % 3 = 2
local y = -7 - math.floor(-7 / 3) * 3
print(y) -- -7-(-3)*3 = 2
-- -7 % -3 = -1
local z = -7 - math.floor(-7 / -3) * (-3)
print(z) -- -7 - 2*(-3) = -1
[注]:这里也有个小技巧: 求余的结果符号只看第二个操作数,比如上式的,-7%-3 = -1;
-7%3 = 2;7%-3 = -2;