накапливать функции в С ++ сбоев не в состоянии найти среднее - PullRequest
1 голос
/ 09 июля 2019

Мне нужно найти число в векторе, которое, если мы уберем, не влияет на среднее, я заменяю каждое число и выявляю среднее и сравниваю, но когда я пытаюсь вычислить среднее после удаления числа, это всегда неправильно, почему

среднее значение - это исходное среднее значение векторных элементов ... среднее значение1 - это новое среднее значение после удаления элемента, но его вычисления каждый раз неверны

#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;
}

1 Ответ

1 голос
/ 11 июля 2019

В вашем коде есть несколько проблем.

В

 it = ser1.begin();

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

вы инициализируете итератор для цикла for.Тогда вы звоните erase.Как вы можете прочитать в cppreference , стирание

"Делает недействительными итераторы и ссылки в или после точки удаления, включая итератор 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 possible\n";
    }
    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 possible\n";
            break;
        }
    }
    return 0;
}   

Надеюсь, это поможет..

...