Redian新闻
>
简单c++问题,大家练练手
avatar
简单c++问题,大家练练手# Programming - 葵花宝典
l*r
1
假设求模运算符"%"限定第一个操作符必须大于等于零,第二个操作符必须大于零
现在希望推广这个运算符,使得第一个参数可以小于零
0. 给出你对第一个参数小于零时求模运算的定义
1. 补充完整以下函数,使得第一个参数可以小于零
int mod( int a, int b)
{
// ...
}
2a. 补充完整以下宏定义,使得第一个参数可以小于零
#define MOD(a,b) // ...
2b. 你写的宏定义可能有副作用吗?
avatar
s*d
2
mod(-a, b) = b - mod(a, b)
#define MOD(a, b) ((a)>0 ? (a)%(b) : ((b) - (-(a))%(b)))
一种副作用就是MOD(a++, b)会错误改变a
avatar
l*r
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

avatar
s*d
4
呵呵,bug处处有
avatar
f*s
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?
: 这个副作用好像是没有办法避免的是吧
: 安全的做法只能定义一个函数了

avatar
l*r
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)

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。