【发布时间】:2016-05-12 02:08:10
【问题描述】:
我正在寻找一个模数运算符Mod(a,b,m) 这样:
Mod(2,6,7)=-3Mod(6,2,7)=3
也就是说,操作员避开了 2 和 6 之间的 4 跳路径,而是通过长度为 3 的路径绕圈。如果您从a 离开并转到b,答案将保留路径方向.
下面的代码计算了这个,但几乎肯定有更好的方法。
#include <iostream>
#include <cmath>
double absmin(double a, double b){
if(std::abs(a)<std::abs(b))
return a;
else
return b;
}
double ModDist(double src, double dest, double m){
if(dest<src)
return absmin(dest+m-src, dest-src);
else
return absmin(dest-src, dest-m-src);
}
int main(){
std::cout<<ModDist(2,6,7)<<std::endl;
std::cout<<ModDist(6,2,7)<<std::endl;
}
【问题讨论】:
-
建议删除C标签。
-
Code Review 上可能更好
-
也许您应该展示您对模数为 7 的其他示例的期望;另外,您对
ModDist(2,5,6)和ModDist(5,2,6)有什么期望,为什么? -
@JonathanLeffler,这是一个很好的边缘案例,我对此没有特别的期望,因为它的距离相同。
-
@chux:我已经更改了一些标签,但是 C/C++ 在这里都很好,因为感兴趣的操作在两种语言之间进行了很少的修改。