l*******r 发帖数: 322 | 1 假设求模运算符"%"限定第一个操作符必须大于等于零,第二个操作符必须大于零
现在希望推广这个运算符,使得第一个参数可以小于零
0. 给出你对第一个参数小于零时求模运算的定义
1. 补充完整以下函数,使得第一个参数可以小于零
int mod( int a, int b)
{
// ...
}
2a. 补充完整以下宏定义,使得第一个参数可以小于零
#define MOD(a,b) // ...
2b. 你写的宏定义可能有副作用吗? | s*******d 发帖数: 59 | 2 mod(-a, b) = b - mod(a, b)
#define MOD(a, b) ((a)>0 ? (a)%(b) : ((b) - (-(a))%(b)))
一种副作用就是MOD(a++, b)会错误改变a | l*******r 发帖数: 322 | 3
so, in your definition,
mod(-b,b) = b - mod(b,b) = b - 0 = b
right?
这个副作用好像是没有办法避免的是吧
安全的做法只能定义一个函数了
【在 s*******d 的大作中提到】 : mod(-a, b) = b - mod(a, b) : #define MOD(a, b) ((a)>0 ? (a)%(b) : ((b) - (-(a))%(b))) : 一种副作用就是MOD(a++, b)会错误改变a
| s*******d 发帖数: 59 | | f******s 发帖数: 140 | 5
这样的话,可以是
mod(-a, b) = mod(b - mod(a, b), b)
【在 l*******r 的大作中提到】 : : so, in your definition, : mod(-b,b) = b - mod(b,b) = b - 0 = b : right? : 这个副作用好像是没有办法避免的是吧 : 安全的做法只能定义一个函数了
| l*******r 发帖数: 322 | 6 b-mod(a,b) 已经确定落在(0,b]的范围内
再做一次mod运算好像不太值得(我不清楚mod是怎么被执行的,有理由假设他比加减要复杂一
点)
我的建议是
mod(-a,b) = (mod(a,b)==0) ? 0 : (b-mod(a,b))
如果编译器能优化公共表达式的话,只需要做一次mod运算
如果不能,也能稍微降低复杂性,on average 一点点
这是我到目前想到的
【在 f******s 的大作中提到】 : : 这样的话,可以是 : mod(-a, b) = mod(b - mod(a, b), b)
|
|