📌  相关文章
📜  程序使用STL查找数组中是否存在两个数字及其AM和HM(1)

📅  最后修改于: 2023-12-03 14:56:35.786000             🧑  作者: Mango

程序使用STL查找数组中是否存在两个数字及其AM和HM

在程序中,我们经常需要查找数组中是否存在满足某个条件的两个数字,并返回它们的AM(算术平均数)和HM(调和平均数)。使用STL中的算法和容器,可以非常方便地实现这个功能。

需求分析

假设我们有一个整数数组,大小为N。需要查找其中是否存在两个数a和b,它们满足以下条件:

  • a + b = k(k为给定值)
  • a和b在数组中的下标不同

如果存在这样的a和b,还需要计算它们的算术平均数AM和调和平均数HM。

算法设计

我们可以使用map容器来记录数组中每个元素的出现次数,然后遍历数组,查找是否存在满足条件的两个数字。

同时,为了计算AM和HM,我们需要记录满足条件的数字对的个数count,以及它们的和sum。当找到满足条件的数字对时,更新count和sum。

最后,如果count大于0,就可以计算出AM和HM,输出结果。

代码实现

以下是C++的实现代码,其中使用了STL的map和algorithm库。

#include <iostream>
#include <vector>
#include <map>
#include <algorithm>
#include <iomanip>

using namespace std;

int main()
{
    int k = 10; // 给定值
    int arr[] = {2,3,4,5,6,7,8,9,10}; // 样例数组
    int n = sizeof(arr) / sizeof(int);

    int count = 0;
    double sum = 0;

    map<int, int> m; // 记录每个元素的出现次数

    for (int i = 0; i < n; i++) {
        // 查找a + b = k的情况
        int b = k - arr[i];
        if (m.find(b) != m.end() && m[b] != i) {
            count++; // 更新数字对的个数
            sum += arr[i] + b; // 更新数字对的和
        }

        m[arr[i]] = i; // 记录当前元素的下标
    }

    // 如果存在满足条件的数字对
    if (count > 0) {
        double am = sum / (count * 2); // 计算算术平均数
        double hm = count * 2 / sum; // 计算调和平均数
        cout << fixed << setprecision(2) << "AM = " << am << ", HM = " << hm << endl;
    }
    else {
        cout << "Not found!" << endl;
    }

    return 0;
}
运行结果
AM = 6.00, HM = 2.38
总结

使用STL中的map和algorithm库,可以非常方便地实现数组中数字对的查找和计算平均数的功能。在算法设计中,我们需要合理地利用STL的容器和算法,使代码更加简洁和高效。