簡體   English   中英

如何在C ++中計算數字之間的距離?

[英]How to compute distance between numbers in c++?

我想借助附圖中描述的系統來計算數字之間的距離。

例如:7與5之間的距離是-2,7與1之間的距離是2等...

任何想法如何在C ++中做到這一點? 首選方向是逆時針方向...我正在使用(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;
}

但是,如果您希望編譯器為此生成最有效的代碼,請遵循黃金法則“盡可能使用無符號類型,僅在必要時使用有符號類型”:

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;
}

這些都是非常復雜的答案。 這是一個簡單的例子:

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

這始終會返回-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

這只是樣式問題。

為了簡單起見,您可以從std :: find找到元素,並從std :: distance開始獲取距離

例如,正如您提到的,將數據保存在int向量中

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édiGhédiri所指出的,您兩次都沒有在逆時針方向計數。 我假設您計算出通往該號碼的最短路徑。 (我使用了數學min()函數)

  2. 與負值相比,您更喜歡正值(@Harper的評論)。 如果您希望使用負值,請切換最后兩個if語句。

可能有一種更簡潔的方法,但是(希望如此)可行。 如果有誤,請發表評論。 希望這會有所幫助!

編輯:這是偽代碼。 用c ++編寫應該很容易。 <stdlib.h>使用abs()函數忘記listlength(list) 對變量使用int類型,其他所有內容都應該起作用。

下面的代碼准備滿足您的所有需求,例如,我假設,如果方向為順時針,則距離為負。

#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 func(a,b)
{
    dist=(b-a);
    if(dist<0) 
      dist +=8;
    return dist;

}

萬一你真的被卡住了

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM