0

不需要代码,只需要简单的数学理论。

像:

  • 打印“输入你的年龄”
  • 阅读(年龄)
  • 如果年龄>20
  • 结果="成人"
  • 打印“你是”
  • 打印(结果)

我将参加 C 语言课程,但在此之前我想学习一些基础知识。我需要一个程序/算法,它使用multiple-if 或 nested-if找到三个数字的最大值和最小值。

4

5 回答 5

5

有一个简单的方法:

int min(int a, int b, int c){
    if (a <= b && a <= c){
        return a;
    }
    if (b <= a && b <= c){
        return b;
    }
    if (c <= a && c <= b){
        return c;
    }
}

有最少比较次数的方法:

int min(int a, int b, int c){
    if (a < b){
        if (a < c){
            return a;
        }
        else{
            return c;
        }
    }
    else{
        if (b < c){
            return b
        }
        else{
            return c;
        }
    }
}

由于三元运算符,代码行数最少:

int min(int a, int b, int c){
    return (a<b)?((a<c)?a:c):((b<c)?b:c);
}

评论中提到了twalberg的方式:

int min(int a, int b){
    if (a <= b){return a;}
    else{return b;}
}

int min(int a, int b, int c){
    return min(min(a,b), c);
}

max 也可以通过所有这些方式定义,替换<>. 您还可以根据以下方式定义它min

int max(int a, int b, int c){
    return -min(-a, -b, -c);
}

如果您还不想学习如何声明函数,您可以将其中的一些直接放到您的主函数中。比如第二种方法:

//todo: translate this pseudocode into C
print "enter three numbers"
read(a)
read(b)
read(c)
if (a < b){
    if (a < c){
        min = a;
    }
    else{
        min = c;
    }
}
else{
    if (b < c){
        min = b
    }
    else{
        min = c;
    }
}
print "the minimum value is " + min
于 2012-09-20T18:02:15.977 回答
0

鉴于问题要求,有两个含义将确定问题的最佳解决方案:

  1. 您必须检查每个数字才能获得解决方案
  2. 最好的解决方案意味着只检查每个数字一次

它会是这样的:

1: Maximum = 0
2: Minimum = 0
3: read(number)
4: if number > Maximum then Maximum = number
5: if number < Minimum then Minimum = number
6: Repeat from 3 as many times as needed
7: Print Maximum and Minimum
于 2012-09-21T16:38:20.807 回答
0

注意:这不是 C;它是 Javascript。然而,对于这样一个普遍的问题,教训是相同的——事实上,由于语法上的相似性,许多相同的代码可以用于等效的 C 性能测试。

这个 JSPerf中,我有四种获取数字数组的最小值/最大值的方法。第一个是直接的方式:

  1. 将最小值和最大值设置为 arr[0]
  2. 从 1 开始循环,使用索引 i
    1. 检查 arr[i] < min; 如果是这样,将 min 设置为 arr[i]
    2. 检查 arr[i] > max; 如果是这样,将 max 设置为 arr[i]
  3. 在循环结束时,返回一个包含 [ min, max ] 的数组

第二种使用分而治之的方法。这通常是对 O(n^2) 问题的改进(例如,一种排序,其中每个值都必须使用简单的实现与每个其他值进行比较),但是对于像这样的 O(n) 问题,不会获得任何东西,并增加堆栈开销。

  1. 如果数组长度为 1 个元素,则返回 [ arr[0], arr[0] ]
  2. 如果数组是 2 个元素长
    1. 如果 arr[0] > arr[1],则返回 [ arr[1], arr[0] ]
    2. 否则,返回 arr
  3. 将数组大致拆分为左半部分和右半部分,每半部分调用 minmax
  4. 返回 [ min(left[0], right[0]), max(left[1], right[1] ]

还有另一个版本的递归,它使用索引来避免创建新数组来执行拆分(Array#slice() 从旧数组中的数据创建一个新数组;这种类型的分配会使事情陷入困境)。

然后是使用 JS 的数学库作为参考点的本机解决方案。

我已经在所有主流浏览器中运行它,因此 JS 引擎实现的任何差异都可以看到。

这里有几个教训:

  1. 有时最简单的解决方案是最好的
  2. 当您处理大量不会更改的数据时,请尽可能指出它;不要产生新的对象来完成一些数学可以处理的工作。
  3. 仅仅因为某事很聪明并不意味着它是正确的(作为一个菜鸟,你真的需要把它放在心上)
  4. 请注意,本机实现几乎与指向递归版本一样慢,而在 Chrome 的情况下,速度更慢。我不确定为什么会这样,但我希望它是从数组到本机参数列表的隐式强制转换,两次(通过 Function#apply())。我们这样做的性能损失是一个意想不到的结果,并且是您在使用库时需要注意的事情。当您在库代码中遇到性能痛点时,可能只是库代码试图做的事情超出了您的预期;将您的数据转换为库的首选格式可能效果不佳。无论问题是什么,有时在没有所有附加功能的情况下将等效功能组合在一起是正确的答案。
  5. 平台很重要。一个系统上的快速可能不在另一个系统上。您不必测试那里的所有内容,但您应该了解您的用户使用什么,并针对其中的每一个进行测试。
于 2015-06-01T02:06:05.123 回答
0

然后是嵌套宏方法(正如 twalberg 在评论中提到的那样),即让编译器从简单的构造中找出它。现代编译器擅长于此。

#define MIN(a,b) (a) < (b) ? (a) : (b)

括号对于获得正确的操作优先级和顺序很重要。

要获得至少三个数字:

min3 = MIN(MIN(a,b), c);

四个数字:

min4 = MIN(MIN(a,b), MIN(c,d));

等等。这具有进一步的优势,即您不需要整数或实数的不同形式。

于 2015-12-08T22:40:15.303 回答
0

有很多方法可以做到这一点

  1. 将元素放入 Array 并找到 max/min。
  2. 声明一个最大/最小变量,一一检查元素并根据条件更新ver。

对于示例 1,我正在编写代码,从 C++ 中的数组中查找 Max

#include<iostream>
#include <bits/stdc++.h>
using namespace std;

int main(){
    int arr[]{2,1,4,12,6,3,20};
    int sum = INT16_MIN;
    for(int x : arr){
        if(x>sum){
            sum =x;
        }
    }
    cout << sum;
    return 0;
}

对于示例 2,我正在编写一个函数,从 C++ 中的 4 个元素中找到 Max

int max_of_four(int a,int b,int c,int d){
    int max = INT16_MIN; //Min Int(16) possible in Code
    if(a>max){
        max=a;
    }if(b>max){
        max=b;
    }if(c>max){
        max = c;
    }if(d>max){
        max =d;
    }
    return max;
}

您可以用 N 组数字替换“四”,但这不是一种有效的方法。使用第一种方法找到最大/最小值

为了找到最小值,将变量设为“INT16_MAX”并将条件从“>”更改为“<”。

于 2021-07-11T07:15:31.803 回答