如何计算 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()
是数学绝对值函数。
我在这里做一些假设。
正如@Hédi Ghédiri 所指出的,您没有两次都逆时针计数。我假设你计算到数字的最短路径。 (我用了数学上的min()
函数)
您更喜欢正值而不是负值(@Harper 的评论)。如果您更喜欢负值,请切换最后两个 if
语句。
可能有更简洁的方法,但这(希望)有效。如有不妥请评论。希望这对您有所帮助!
编辑:这是伪代码。用c++写应该很容易。在<stdlib.h>
中使用abs()
函数忘记list
和length(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
这只是风格问题。
我想借助附图中描述的系统计算数字之间的距离。
例如: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()
是数学绝对值函数。
我在这里做一些假设。
正如@Hédi Ghédiri 所指出的,您没有两次都逆时针计数。我假设你计算到数字的最短路径。 (我用了数学上的
min()
函数)您更喜欢正值而不是负值(@Harper 的评论)。如果您更喜欢负值,请切换最后两个
if
语句。
可能有更简洁的方法,但这(希望)有效。如有不妥请评论。希望这对您有所帮助!
编辑:这是伪代码。用c++写应该很容易。在<stdlib.h>
中使用abs()
函数忘记list
和length(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
这只是风格问题。