Сравнение Поплавков в векторе - PullRequest
0 голосов
/ 17 января 2019

Я пишу программу, которая создает два вектора для практики сравнения элементов в векторе. Первый вектор представляет собой список всех чисел, которые не являются простыми числами в диапазоне от 1 до 100 (не простые числа), второй вектор представляет собой список всех чисел в диапазоне от 1 до 100 (вектор number_bank). Я использую циклы для сравнения каждого элемента в векторах. Допустим, число 5 происходит от number_bank (который является простым числом), если это число не совпадает ни с одним из чисел в векторе not_prime_numbers, то оно возвращается в третий вектор, называемый простыми числами. Если сравнивать число, подобное 4, с элементами списка not_prime_number, то оно должно совпадать с числом 4 в этом списке и прерывать цикл, не возвращая число обратно в вектор prime_numbers. То, что происходит, - все числа между 1-100 оттесняются. Значение 4 в векторе number_bank никогда не равно 4 в векторе not_prime_numbers, поэтому цикл продолжает отталкивать 4 назад в вектор простых чисел.

Нет никакой математики, связанной с изменением элементов в этих векторах, поэтому не должно быть дополнительного запаса погрешности (эпсилон), обычно связываемого со сравнением чисел с плавающей запятой. Есть ли лучший способ сравнить элементы в этих векторах?

int main()
{
    float i = 1.0;
    unsigned int n = 0;
    std::vector<float>not_prime_numbers;
    std::vector<float>number_bank;
    std::vector<float>prime_numbers;
    while (i < 101.0)
    {
        for (float j = 1.0;j<(i);++j)
        {
            float p = i / j;
            if (abs(floor(p)) == p&&j!=1.0)
            {
                not_prime_numbers.push_back(i);
                break;
            }
        }
        ++i;
    }

    for (float k = 1.0; k < 101.0; ++k)
    {
        number_bank.push_back(k);
    }

    for (unsigned int m = 0; m < number_bank.size(); ++m)
    {
        while (n < not_prime_numbers.size())
        {
            if (not_prime_numbers[n] == number_bank[m])  // here is where i try to break the loop
            {                                            
            break;                                   
            }
            if (n == (not_prime_numbers.size()-1))
            {                   // here is where element is pushed back when compared to all loop elements
                prime_numbers.push_back(number_bank[m]);
                break;
            }
            if (not_prime_numbers[n] != number_bank[m])
            {
                ++n;
            }

        }
    }


    std::cout << "All prime numbers between 0 and 100 are as follows:\n";
    for (unsigned int j = 0; j < prime_numbers.size(); ++j)
    {
        std::cout << prime_numbers[j] << "\n";
    }
    return 0;
}

Я читал о .compare и попробовал его, но там говорится, что слева должна быть структура классов (возможно, вектор не имеет структуры классов?). Я новичок в C ++ и буду очень признателен за помощь.

1 Ответ

0 голосов
/ 17 января 2019

Вы никогда не сбросите n, поэтому, как только вы получите простое число (когда n == (not_prime_numbers.size()-1)), остальные числа также будут добавлены в основной список.

Почему вы проверяете это условие в цикле? Вам следует установить флаговую переменную, если вы обнаружите, что число не простое, а затем проверьте это после цикла, чтобы, возможно, добавить его в ваш основной список.

...