c++ - 保留模距离的符号

标签 c++ c algorithm math mod

我正在寻找一个模运算符 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/

相关文章:

c++ - 为什么需要同时使用 fixed 和 showpoint 操纵器来显示小数点和尾随零,而只有 fixed 才能完成这项工作?

c - 如何在 UNIX 上将 PID 写入文件

python - 结果差异的原因是什么?

c++ - c++中的每个线程都有自己的内存分配限制吗

c++ - 具有不同顺序或变量的模板类(颜色/像素类)

c++ - C++ 中的 BitTorrent Peer Wire 消息

c++ - 程序在使用 struct tm 时崩溃,除非先声明 time_t

c - 如何用 C 语言计算矩阵的幂

c++ - 极慢的双线性插值(与 OpenCV 相比)

C语言写模式的正确方法