[英]How to compute distance between numbers in c++?
如果以直接方式(考慮所有可能性)進行操作,則可能如下所示
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()
是數學絕對值函數。
我在這里做一些假設。
正如@HédiGhédiri所指出的,您兩次都沒有在逆時針方向計數。 我假設您計算出通往該號碼的最短路徑。 (我使用了數學min()
函數)
與負值相比,您更喜歡正值(@Harper的評論)。 如果您希望使用負值,請切換最后兩個if
語句。
可能有一種更簡潔的方法,但是(希望如此)可行。 如果有誤,請發表評論。 希望這會有所幫助!
編輯:這是偽代碼。 用c ++編寫應該很容易。 在<stdlib.h>
使用abs()
函數忘記list
和length(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.