1

Здравствуйте. Помогите найти пожалуйста ошибку в реализации поиска k-ого элемента в массиве по неубыванию для чисел значение которых равно формуле:

введите сюда описание изображения,

где A,B,C ,a1,a2 мы задаем сами.

#include "stdafx.h"
#include <iostream>

using namespace std;
int partition(int a[], int left, int right)
{
    int marker = left;

    for (int i = left; i <= right; i++)
    {
        if (a[i] <= a[right])
        {
            swap(a[marker], a[i]);
            marker++;
        }
    }

    return marker - 1;
}


int finder(int a[] , int k , int n)
{
    int left = 0, right = n - 1;

    while (true)
    {
        int mid = partition(a, left, right);

        if ((mid) == (k))
        {
            return a[mid];
        }
        else if (k < mid)
        {
            right = mid - 1;
        }
        else
        {
            left = mid + 1;
        }
    }
}

int main()
{
    int n, k;
    int a[3 * 10000], A, B, C;
    cin >> n >> k;
    k--;

    if (n == 1)
    {
        cin >> A >> B >> C >> a[0];
        in.close();
    }
    else
    {
        cin >> A >> B >> C >> a[0] >> a[1];

        for (int i = 2; i < n; i++)
        {
            a[i] = A * a[i - 2] + B * a[i - 1] + C;
        }
    }

    if (n == 1)
    {
        cout << a[0];
    }
    else
    {
        cout << finder(a, i, n) << endl;
    }

    return 0;
}
Harry
  • 221,325
  • Обычно статистика на целых числах не считается. Кроме того сравнение (mid) == (k) так не делают, сравнение делают с точностью до эпсилон. Возможно отсутствие эпсилон не позволяет вам попасть в диапазон. – nick_n_a Oct 18 '17 at 11:00
  • Спасибо за редактирование вопроса и за информацию за статистику, получается, если у меня есть дополнительное условие: Все вычисления должны производится в 32 битном знаковом типе, переполнения должны игнорироваться, то я должен писать A,B,C ,a1,a2 в float? – Даниил Един Oct 18 '17 at 11:10
  • Про сравнение можно почитать тут. https://ru.stackoverflow.com/questions/399420/%D0%91%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE-%D0%BB%D0%B8-%D1%81%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B4%D0%BB%D1%8F-%D1%82%D0%B8%D0%BF%D0%B0-double Для вашего случая, вполне возможно что у вас эпсилон больше 1 что может несовсем правильно, но поможет найти ошибку. Трассируйте, подготовив ручной расчёт каждого шага, что б проверить себя. – nick_n_a Oct 18 '17 at 11:20
  • явно укажите пример ввода (A,B,C ,a1,a2) и какой результат точно ожидали, и что вместо этого ваш код возвращает. – jfs Oct 18 '17 at 11:20
  • Для n = 5 , k = 3 , A=2 , B = 3, C = 5, a1 =1, a2 = 2 => 13; Для n = 5 , k = 3 , A=200000 , B = 300000, C = 5, a1 =1, a2 = 2 => 2; – Даниил Един Oct 18 '17 at 11:22
  • Ещё есть вариант, что ваш "ряд" расходится, тогда ответ вы никогда не получите. это может произойти как из-за ошибки, так и из-за неверно поставленой задачи. Посчитайте задачу в excel или на калькуляторе, и сравните с тем какие результаты ваша программа даёт. – nick_n_a Oct 18 '17 at 11:36
  • всю необходимую для ответа информацию необходимо в сам вопрос помещать. Нажмите кнопку [edit] под вопросом. Что значит " Все вычисления должны производится в 32 битном знаковом типе, переполнения должны игнорироваться" -- переполнение int ведёт к неопределённому поведению UB в С++. С вашим примером не ясно как вы 2 получили в качестве 3-ей поря́дковой стати́стики вместо 800005 для {1, 2, 800005, 240001900005, 72000730002500005} – jfs Oct 19 '17 at 15:26

0 Answers0