我正在寻找一个模运算符 Mod(a,b,m)
这样:
Mod(2,6,7)=-3
Mod(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;
}
最佳答案
如果您的直接距离小于距离的一半,那么您走另一条路不会做得更好。相反,如果它大于一半的距离,您可以通过改变方向做得更好。
假设 0<=src,dest<=m
double ModDist(double src, double dest, double m){
double directDistance = dest - src;
if(abs(directDistance)<m/2)
return directDistance;
return -(m - abs(directDistance))*sgn(directDistance);
}
关于c++ - 保留模距离的符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37176083/