C++中的累积函数故障无法找到平均值

accumulate function in c++ malfunctioning not able to find mean

本文关键字:平均值 故障 函数 C++      更新时间:2023-10-16

我需要在向量中找到一个数字,如果我们取出它不会影响平均值,我会替换每个数字并找出平均值并进行比较,但是当我尝试在删除数字后计算平均值时,它总是不正确为什么?

均值

是向量元素的原始均值...mean1 是删除元素后的新平均值,但其计算每次都是错误的

#include <iostream>
#include <vector>
#include <numeric>
#include <iterator>
using namespace std;
int main() 
{
    int t;
    cin >> t;
    while (t--) 
    {
        int n, i, sum = 0, sum1 = 0;
        cin >> n;
        vector<int> ser;
        for (i = 0; i < n; i++) 
        {
            int temp;
            cin >> temp;
            ser.push_back(temp);
        }
        int mean = accumulate(ser.begin(), ser.end(), sum) / n;
        vector<int> ser1;
        ser1 = ser;
        bool flag = false;
        vector<int>::iterator it;
        it = ser1.begin();
        for (i = 0; i < n; i++) 
        {
            ser1.erase(it);
            int mean1 = accumulate(ser1.begin(), ser1.end(), 0) / (ser1.size());
            if (mean == mean1) 
            {
                cout << i;
                flag = true;
                break;
            }
            else 
            {
                ser1 = ser;
                continue;
            }
        }
        if (flag == false) {
            cout << "Impossible";
        }
    }
    return 0;
}

你的代码中有几个问题。

 it = ser1.begin();
        for (i = 0; i < n; i++) 
        {
            ser1.erase(it);

您正在启动用于 for 循环的迭代器。然后你打电话给erase.正如您可以在cpp首选项中阅读的那样,擦除

"在擦除点或之后使迭代器和引用无效,包括 end(( 迭代器。">

在您的情况下甚至可以,因为您永远不会增加迭代器。这意味着,您总是在擦除第一个元素。所以 2 个错误。这是行不通的。

您还对平均值使用了错误的数据类型。

另请阅读您帖子下的评论。 基本上已经提到的所有内容。

我将向您展示另外 2 个建议,代码的外观。

第一个版本检查,如果可以减少。

第二个版本在循环中反复执行此缩减。

版本1:


#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
#include <numeric>
using NumberType = int;
constexpr size_t MinNumberOfValuesToCheck = 1;
constexpr size_t MaxNumberOfValuesToCheck = 20;
int main()
{
    // Read the number of values to check
    std::cout << "How many vaues shall be checked? Please enter a number:  ";
    size_t numberOfValuesToCheck{0};
    std::cin >> numberOfValuesToCheck;
    // Limit the input to meaningful values
    numberOfValuesToCheck = std::clamp(numberOfValuesToCheck, MinNumberOfValuesToCheck, MaxNumberOfValuesToCheck);
    // Here we will store all values
    std::vector<NumberType> values(numberOfValuesToCheck);
    // Read all user input and stor it in our vector
    std::copy_n(std::istream_iterator<NumberType>(std::cin), numberOfValuesToCheck, values.begin());
    // Calculate mean. The result is most likely a double
    double meanValue {static_cast<double>(std::accumulate(values.begin(), values.end(), 0)) / static_cast<double>(values.size())};
    std::cout << "nMean value: " << meanValue << 'n';
    // Look, if there is a mean value
    std::vector<NumberType>::iterator found = std::find_if(values.begin(),values.end(),[&meanValue](NumberType& n){ return n == meanValue;});
    if (found != values.end() ) {
        std::cout << "Could erase " << *found << "New Vector:n";
        std::copy(values.begin(), values.end(), std::ostream_iterator<NumberType>(std::cout, " "));
    }
    else {
        std::cout << "No reduction possiblen";
    }
    return 0;
}

版本 2。更"完整的解决方案。

#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
#include <numeric>
using NumberType = int;
constexpr size_t MinNumberOfValuesToCheck = 1;
constexpr size_t MaxNumberOfValuesToCheck = 20;
int main()
{
    // Read the number of values to check
    std::cout << "How many vaues shall be checked? Please enter a number:  ";
    size_t numberOfValuesToCheck{0};
    std::cin >> numberOfValuesToCheck;
    // Limit the input to meaningful values
    numberOfValuesToCheck = std::clamp(numberOfValuesToCheck, MinNumberOfValuesToCheck, MaxNumberOfValuesToCheck);
    // Here we will store all values
    std::vector<NumberType> values(numberOfValuesToCheck);
    // Read all user input and stor it in our vector
    std::copy_n(std::istream_iterator<NumberType>(std::cin), numberOfValuesToCheck, values.begin());
    while(numberOfValuesToCheck) {
        // Calculate mean. The result is most likely a double
        double meanValue {static_cast<double>(std::accumulate(values.begin(), values.end(), 0)) / static_cast<double>(values.size())};
        std::cout << "nMean value: " << meanValue << 'n';
        values.erase(std::remove_if(values.begin(),values.end(),[&meanValue](NumberType& v){ return v == meanValue;}),values.end());
        // Check if we coud remove a value
        if (values.size() < numberOfValuesToCheck) {
            // If so then the vector has less values
            // Show some output:
            std::cout << "Could eliminate " << numberOfValuesToCheck - values.size() << " from Vector of Values. New vector:n";
            std::copy(values.begin(), values.end(), std::ostream_iterator<NumberType>(std::cout, " "));
            // New size of vector
            numberOfValuesToCheck = values.size();
        }
        else {
            // Could not reduce more
            std::cout << "No further reduction possiblen";
            break;
        }
    }
    return 0;
}   

希望这有帮助。 。 。