如何计算 C++ 中数字之间的距离?

How to compute distance between numbers in c++?

我想借助附图中描述的系统计算数字之间的距离。

例如:7和5之间的距离是-2,7和1之间的距离是2等等...

知道如何在 C++ 中执行此操作吗?首选方向是逆时针... 我正在使用 (int) 向量。

认为这应该可行

int func(a,b)
{
    dist=(b-a);
    if(dist<0) 
      dist +=8;
    return dist;

}

万一你真的卡住了

为简单起见,您可以从 std::find and get the distance from start from std::distance

中找到元素

例如 正如你提到的保存在 int vector

中的数据
std::vector<int>::iterator it1 = std::find(myvec.begin(), myvec.end(), val_1);
std::vector<int>::iterator it2 = std::find(myvec.begin(), myvec.end(), val_2);

int dist = std::distance(myvec.begin(),it1) - std::distance(myvec.begin.it2);
if(dist < 0) return dist
else(dist > 0) return myvector.size() - dist()

所以希望这会给出图像的距离...

我很确定这行得通:

list = [0,1,2,3,4,5,6,7]
distance(x,y) {
    a = y-x
    b = length(list)-abs(y-x)
    z = min(abs(a), abs(b))
    if(z=abs(a)) { return a }
    if(z=abs(b)) { return b }
}

其中 abs() 是数学绝对值函数。

我在这里做一些假设。

  1. 正如@Hédi Ghédiri 所指出的,您没有两次都逆时针计数。我假设你计算到数字的最短路径。 (我用了数学上的min()函数)

  2. 您更喜欢正值而不是负值(@Harper 的评论)。如果您更喜欢负值,请切换最后两个 if 语句。

可能有更简洁的方法,但这(希望)有效。如有不妥请评论。希望这对您有所帮助!

编辑:这是伪代码。用c++写应该很容易。在<stdlib.h>中使用abs()函数忘记listlength(list)。对变量使用 int 类型,其他一切都应该有效。

如果您以直接的方式(通过考虑所有可能性)进行操作,它可能如下所示

int distance(int a, int b)
{ // Distance from `a` to `b`
  int d = b - a;
  return
    a <= b ? 
      (d <= +4 ? d : d - 8) :
      (d <= -4 ? d + 8 : d);
}

如果您愿意,可以将其重写为

int distance(int a, int b)
{ // Distance from `a` to `b`
  int d = b - a;
  return -4 < d && d <= 4 ? d : (d > 0 ? d - 8 : d + 8);
}

另一种更优雅的方法是始终计算正 CCW 距离,如果它大于 4,则将其翻转为负 CW 距离

int distance(int a, int b)
{ // Distance from `a` to `b`
  int d = (b + 8 - a) % 8;
  // `d` is CCW distance from `a` to `b`
  return d <= 4 ? d : d - 8;
}

但是如果您希望编译器为此生成最高效的代码,请遵循黄金法则"use unsigned types everywhere you can, use signed types only if you have to":

int distance(unsigned a, unsigned b)
{ // Distance from `a` to `b`
  unsigned d = (b + 8 - a) % 8;
  // `d` is CCW distance from `a` to `b`
  return d <= 4 ? d : (int) d - 8;
}

下面的代码可以满足您的所有需求,例如我假设,如果方向是顺时针,则距离为负。

#include <iostream>

#define RING_SIZE 8

enum direction
{
    clockwise,
    counterClockwise
};

int distance(int a, int b, direction dir)
{
    int dist;
    if(dir == clockwise)
    {
        if(a>b)
        {
            dist = -(a-b); 
        }
        else
        {
            dist =-(RING_SIZE-b+a); 
        }
    }
    else
    {
        if(a<b)
        {
            dist = b-a; 
        }
        else
        {
            dist = RING_SIZE-a+b; 
        }

    }
    if(a==b) dist = 0;//Add this if distance between same point must to be 0
    return dist;
}

int main()
{
  std::cout << distance(7, 2, clockwise) << std::endl;
}

这些答案真的很复杂。这是一个更简单的:

int distance(int x, int y) {
    int d = (y - x) & 7;
    return d > 4 ? d - 8 : d;
}

这总是 returns 范围内的结果 -3..+4。当环的大小是 2 的幂时,模运算更简单一些,这里就是这种情况。

distance(7, 5) = -2
distance(5, 7) = +2
distance(6, 2) = +4
distance(2, 6) = +4

我们使用 & 7 因为这是获得模数的最简单方法。或者,您可以使用 % 8,但您还必须添加 8 以确保输入不是负数:

int d = (y - x + 8) % 8; // same result

或者,您可以显式处理负数:

int d = (y - x) % 8;
if (d < 0) {
    d += 8;
}
// same result

这只是风格问题。