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

时间:2017-02-11 17:30:54

标签: c

所以,我正在推荐一本推荐的初学者书中的一些练习:C Programming: A Modern Approach (2nd Edition)在解决其中一个我发现自己无法继续的问题时,因为我无法返回最接近用户的输入。 注意:问题是在循环,函数和数组被覆盖之前被问到的,因此我假设不需要这些。

我设法将问题提取并简化为以下内容。假设我有以下数字,我想返回最接近用户输入的数字:

10 20 30 40 50 60 70 80

printf("Enter a number to find closest value: ");
scanf("%d", &num);

例如:

User's input: 28 Closest number: 30

接下来,我决定通过减去每个数字来找出num与每个数字之间的差异。

difference1 = num - 10;
difference2 = num - 20;

等等。 (我没有使用循环,因为书中尚未涉及这些循环)

我考虑到了负面差异(25 - 40 = -15)。如果差异小于0,我会将差值乘以-1,以便将所有差异乘以正整数。通过这样做,我将能够成功地比较差异:

    if (difference1 < 0) {
    difference1 = difference1 * -1;
}

接下来,我正在检查最小差异,以便确定哪个是最接近的数字:

if (difference1 < difference2) {
    min1 = difference1;
}
else {                  
    min1 = difference2;
}

if (difference3 < difference4) {
    min2 = difference3;
}
else {
    min2 = difference4;
}

if (difference5 < difference6) {
    min3 = difference5;
}
else {
    min3 = difference6;
}

if (difference7 < difference8) {
    min4 = difference7;
}
else {
    min4 = difference8;
}

if (min1 < min2) {
    min5 = min1;
}
else {
    min5 = min2;
}

if (min3 < min4) {
    min6 = min3;
}
else {
    min6 = min4;
}

if (min5 < min6) {
    min = min5;
}
else {
    min = min6;
}

我知道这是一个非常长的方法,但是我不能在不使用for循环的情况下缩短代码。

printf("Difference between the two numbers is %d\n", min);

由于min包含用户输入和最接近数字之间的差异,我无法找到打印最接近用户输入的数字的方法。 如何跟踪从原始数字中减去的最小差异?任何建议将不胜感激,请原谅这个问题的基本性质。

5 个答案:

答案 0 :(得分:0)

我会做什么:

$firstname = preg_replace("/^[A-Za-z]+$/", "", $firstname);
$lastname = preg_replace("/^[A-Za-z]+$/", "", $lastname);

}

其中abs是绝对值。数字应该在某些数据结构中,因为在同一时间你应该询问你是否还有一些要检查的东西。

答案 1 :(得分:0)

我可以帮助您缩短代码。

这是我的方法

int num = 71;
int diff,ans;
int div10 = (num / 10);
int lower = div10 * 10;
int upper = (div10 + 1) * 10;
if(lower<10) lower=10;
if(lower>80) lower=80;
if(upper<10) upper=10;
if(upper>80) upper=80;
int diff1 = lower - num;
int diff2 = upper - num;
if(diff1 < 0) diff1 *= -1;
if(diff2 < 0) diff2 *= -1;
if(diff1 < diff2) {
    ans = lower;
    diff = diff1;
}
else {
    ans = upper;
    diff = diff2;
}
printf("ans=%d, diff=%d\n",ans,diff);

答案 2 :(得分:0)

如果你正在处理10s,这应该很简单:

num += 5;
closest_10 = num/10;
closest_10 *= 10;

如果您有一组数字,那么您可以进行简单的查找。您可以使用类似的算法将其扩展为其他倍数(例如,对于8s,只需将5替换为4和10)。

答案 3 :(得分:0)

由于所有数字都已修复,最佳方法(至少在编译后效率最高)是使用以下代码片段:

int closest(int number)
{
    switch(number) {
    case 0: case 1: case 2: case 3: case 4:
        return 0;
    case 5: case 6: case 7: case 8: case 9:
    case 10: case 11: case 12: case 13: case 14:
        return 10;
    ...
    case 95: case 96: case 97: case 98: case 99: case 100:
        return 100;
    } /* switch */
 } /* closest */

如果您可以内联代码而不是编写函数,效率会更高。

答案 4 :(得分:-1)

您需要更好地定义:假设我有以下数字

多少个数字是个大问题。你的例子让它们全部被10整除。你的数字是10,20,30等等,你总共提到了8个数字。最多只有8个数字吗?它们可以是任何数字吗?它们都是整数吗?如果它的所有整数都可被10整除,则可以使用模数模数运算符代替减法。
mod运算符%仅适用于整数。

int a, b, c;

a = 3;
b = 25

c = a % 10;   /* c will equal 3,  0 / 10 = 0 with remainder 3 */
c = b % 10;   /* c will equal 5, 25 / 10 = 2 but remainder is 5 */

/* check if a number is even, just mod by 2 if zero then even */
if ( ( b % 2 ) == 0 )
    printf(" value in b is even number\n");
else
    printf(" value in b is odd number\n");