一:max函数
第一大:=MAX(A1:A100)
第二大:=MAX(IF(A1:A100<MAX(A1:A100),A1:A100))
先求出小于最大值的数组,然后在数组中找到最大值,就是第二大了
二、large函数
用large函数
第一大:=LARGE(A1:A100,1)
第二大:=LARGE(A1:A100,COUNTIF(A1:A100,LARGE(A1:A100,1))+1)
求出最大值的个数n,并求出第n+1位的最大值。(因为large函数遇到数值相同的,第二大会和第一大相同)。
还能用函数找出数值多个时,在范围中出现位置:
比如刚才的公式在b5,则
第一次出现的位置:
=ADDRESS(MIN(IF(A1:A100=B5,ROW(A1:A100))),4)
或:
=ADDRESS(SMALL(IF(A1:A100=B1,ROW(A1:A100)),1),4)
最后一次出现的位置:
=ADDRESS(Max(IF(A1:A100=B5,ROW(A1:A100))),4)
或:
=ADDRESS(LARGE(IF(A1:A100=B1,ROW(A1:A100)),1),4)
同理,第二次出现的位置:
=ADDRESS(SMALL(IF(A1:A100=B1,ROW(A1:A100)),2),4)
倒数第二次出现的位置:
=ADDRESS(LARGE(IF(A1:A100=B1,ROW(A1:A100)),2),4)
需按Ctrl+Shift+Enter结束公式输入。
基本思想是遍历数组,并使用两个变量来存储当前遍历过的数中最大的两个数。这样当数组遍历完毕时两个变量存储的也是整个数组最大的两个数。代码如下:
int find_second_max(int *a, size_t n) //数组a,长度n>1{
/*用a[0]和a[1]来初始化max和second_max*/
int second_max = a[0], max = a[0]
if (a[1] > a[0]) max = a[1]
else second_max = a[1]
for (size_t i = 2 i < n ++i) {
if (a[i] > max) max = a[i]
else if (a[i] > second_max) second_max = a[i]
}
return second_max
}
如果不注重效率而只注重代码的简单,可以直接用C++的库函数sort对整个数组排序。代码如下:
#include <algorithm>#include <vector>
int find_second_max(int *a, size_t n) //数组a,长度n>1
{
std::vector<int> v(a, a + n) //将a复制到v中
std::sort(v.begin(), v.end()) //排序
return v[n - 2] //倒数第2个数就是第2大的数
}
#include <algorithm>#include <vector>
int find_second_max(int *a, size_t n) //数组a,长度n>1
{
std::vector<int>v(a, a + n) //将a复制到v中
std::sort(v.begin(), v.end())//排序
return v[n - 2] //倒数第2个数就是第2大的数
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)