不需要代码,只需要简单的数学理论。
像:
- 打印“输入你的年龄”
- 阅读(年龄)
- 如果年龄>20
- 结果="成人"
- 打印“你是”
- 打印(结果)
我将参加 C 语言课程,但在此之前我想学习一些基础知识。我需要一个程序/算法,它使用multiple-if 或 nested-if找到三个数字的最大值和最小值。
不需要代码,只需要简单的数学理论。
像:
我将参加 C 语言课程,但在此之前我想学习一些基础知识。我需要一个程序/算法,它使用multiple-if 或 nested-if找到三个数字的最大值和最小值。
有一个简单的方法:
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
鉴于问题要求,有两个含义将确定问题的最佳解决方案:
它会是这样的:
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
注意:这不是 C;它是 Javascript。然而,对于这样一个普遍的问题,教训是相同的——事实上,由于语法上的相似性,许多相同的代码可以用于等效的 C 性能测试。
在这个 JSPerf中,我有四种获取数字数组的最小值/最大值的方法。第一个是直接的方式:
第二种使用分而治之的方法。这通常是对 O(n^2) 问题的改进(例如,一种排序,其中每个值都必须使用简单的实现与每个其他值进行比较),但是对于像这样的 O(n) 问题,不会获得任何东西,并增加堆栈开销。
还有另一个版本的递归,它使用索引来避免创建新数组来执行拆分(Array#slice() 从旧数组中的数据创建一个新数组;这种类型的分配会使事情陷入困境)。
然后是使用 JS 的数学库作为参考点的本机解决方案。
我已经在所有主流浏览器中运行它,因此 JS 引擎实现的任何差异都可以看到。
这里有几个教训:
然后是嵌套宏方法(正如 twalberg 在评论中提到的那样),即让编译器从简单的构造中找出它。现代编译器擅长于此。
#define MIN(a,b) (a) < (b) ? (a) : (b)
括号对于获得正确的操作优先级和顺序很重要。
要获得至少三个数字:
min3 = MIN(MIN(a,b), c);
四个数字:
min4 = MIN(MIN(a,b), MIN(c,d));
等等。这具有进一步的优势,即您不需要整数或实数的不同形式。
有很多方法可以做到这一点
- 将元素放入 Array 并找到 max/min。
- 声明一个最大/最小变量,一一检查元素并根据条件更新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”并将条件从“>”更改为“<”。