如何找到与C中的数字最接近的值?

如何找到与C中的数字最接近的值?,c,algorithm,comparison,C,Algorithm,Comparison,我有以下C代码: #define CONST 1200 int a = 900; int b = 1050; int c = 1400; if (A_CLOSEST_TO_CONST) { // do something } 检查a是否是a、b和c中最接近常数的值的便捷方法是什么 编辑: 无论我是否有3个变量或类似的数组(可能不止3个元素): 您需要将常量与每个元素进行比较。(适用于3个元素,但对于较大的elementcount,这是一个非常糟糕的解决方案,在这种情况下,我建议使用某种分

我有以下C代码:

#define CONST 1200
int a = 900;
int b = 1050;
int c = 1400;

if (A_CLOSEST_TO_CONST) {
  // do something
}
检查a是否是a、b和c中最接近常数的值的便捷方法是什么

编辑:

无论我是否有3个变量或类似的数组(可能不止3个元素):


您需要将常量与每个元素进行比较。(适用于3个元素,但对于较大的elementcount,这是一个非常糟糕的解决方案,在这种情况下,我建议使用某种分治方法)。比较后,取它们的差值,最小的差值是常数最接近的差值)

比较(a-const),(b-const)和(c-const)的绝对值。无论哪一个绝对值最低,都是最接近的。

这适用于三个变量:

if (abs(a - CONST) <= abs(b - CONST) && abs(a - CONST) <= abs(c - CONST)) {
    // a is the closest
}

if(abs(a-CONST)此答案是对您编辑原始问题和评论的反应。
(请注意,为了确定数组的结尾,我们可以使用不同的方法,我将在这个特定场景中使用的方法是最简单的方法。)

//我认为您需要为abs()包含math.h,或者自己实现它。
//该代码不处理重复项。
//我还没试过,所以可能有个虫子潜伏在里面。
常量int ArraySize=;
常数int=常数;
int值[ArraySize]={……};
int tempmimum=abs(YourArray[0]-YourConstant);//最简单的方法
对于(inti=1;i
对于一个大的排序集,您应该能够使用二进制搜索来查找与数字相邻的两个数字(模边情况),其中一个必须是最接近的


因此,您将能够实现O(logn)性能,而不是O(n)。

这里是一个通用的方法
函数接受int数组、数组大小和指向比较函数的指针。如果第一个值小于第二个值,比较谓词将返回true。刚刚返回
a
的函数将查找数组中最小的元素。
pinouchon()
比较谓词执行贴近度比较

#include <stdio.h>
#include <stdlib.h>

#define CONST 1200

int pinouchon(int a, int b)
{
    return abs(a - CONST) < abs(b - CONST);
}

int min_element(const int *arr, int size, int(*pred)(int, int))
{
    int i, found = arr[0];
    for (i = 1; i < size; ++i)
    {
        if (pred(arr[i], found)) found = arr[i];
    }
    return found;
}

int main()
{
    int values[3] = {900, 1050, 1400};
    printf("%d\n", min_element(values, 3, pinouchon));
    return 0;
}
#包括
#包括
#定义常数1200
内皮诺孔(内a、内b)
{
返回abs(a-CONST)
伪代码:

closest_value := NULL
closest_distance := MAX_NUMBER
for(value_in_list)              
    distance := abs(value_in_list - CONST)
    if (distance < closest_distance)
        closest_value := value_in_list
        closest_distance := distance
print closest_value, closest_distance        
最近的_值:=NULL
最近_距离:=最大_数
用于(值在值列表中)
距离:=abs(列表中的值-常数)
if(距离<最近距离)
最近的_值:=_列表中的值
最近距离:=距离
打印最近的_值、最近的_距离

我在Mark Byres代码中添加了一些内容

int is_first_closest(int values[]) {
    int dist = abs(values[0] - CONST),closest;     //calculaing first difference
    int size = sizeof( values )                    //calculating the size of array
    for (int i = 1; i < size; ++i) {
        if (abs(values[i] - CONST) < dist) {       //checking for closest value
             dist=abs(values[i] - CONST);          //saving closest value in dist
             closest=i;                            //saving the position of the closest value
        }
    }
    return values[i];
}
int是最接近的(int值[]){
int dist=abs(值[0]-CONST),最近;//计算第一个差
int size=sizeof(values)//计算数组的大小
对于(int i=1;i

此函数将获取一个整数数组,并返回最接近常数的数字。

这是一个搜索练习。通常为min(abs(val CONST))这更像是一个数学问题,而不是一个C编码问题。试着最小化常量和数字之间差值的绝对值。我不想要最接近的值,我想知道某个特定选择的变量(比如a)是否是closest@pinouchon在第二行中,将a与搜索结果进行比较(为了更好的结果缓存你的搜索结果)这就是想法。我想知道你是否可以很容易地概括它。(例如4个变量)@皮诺雄:如果你使用一个由n个元素组成的数组而不是n个变量,那就更好了。如果你想使用这种线性方法,请将常数插入数组中,并在数组中循环,比较每个元素。@markByers编辑了我的问题,如果你有一个带有数组的通用解决方案,我会很高兴。一种使这个函数更简单的方法ric将传递第三个参数,该参数表示我们感兴趣的整数的位置。如果希望保持is_first_closest()中的逻辑相同,只需在开始时将第一个值与所需位置的值交换,然后返回。
#include <stdio.h>
#include <stdlib.h>

#define CONST 1200

int pinouchon(int a, int b)
{
    return abs(a - CONST) < abs(b - CONST);
}

int min_element(const int *arr, int size, int(*pred)(int, int))
{
    int i, found = arr[0];
    for (i = 1; i < size; ++i)
    {
        if (pred(arr[i], found)) found = arr[i];
    }
    return found;
}

int main()
{
    int values[3] = {900, 1050, 1400};
    printf("%d\n", min_element(values, 3, pinouchon));
    return 0;
}
closest_value := NULL
closest_distance := MAX_NUMBER
for(value_in_list)              
    distance := abs(value_in_list - CONST)
    if (distance < closest_distance)
        closest_value := value_in_list
        closest_distance := distance
print closest_value, closest_distance        
int is_first_closest(int values[]) {
    int dist = abs(values[0] - CONST),closest;     //calculaing first difference
    int size = sizeof( values )                    //calculating the size of array
    for (int i = 1; i < size; ++i) {
        if (abs(values[i] - CONST) < dist) {       //checking for closest value
             dist=abs(values[i] - CONST);          //saving closest value in dist
             closest=i;                            //saving the position of the closest value
        }
    }
    return values[i];
}