Где ошибка в моем коде

0

Я новичок. Я пытался изучить использование необязательного третьего параметра функции sort(). Я попытался применить это для сортировки чисел от 1 до 1000 в соответствии с их количеством делителей в порядке возрастания.

Вот мой код

#include <iostream>
#include <cstdio>
#include <algorithm>

using namespace std;

struct data {
    int index;
    int divisor;
}a[1001];

bool sortbydivisor (const data &lhs,const data &rhs)
{
    return lhs.divisor <rhs.divisor;
}

int number_of_divisors(int n)
{
    int r=0;
    for (int i=1;i*i<=n;i++)
    {
        if (n%i==0)
        {
            if (i*i!=n)
            {
                r+=2;
            }
        else 
            {
                r+=1;
            }
    }
}

return r;
}

int main ()
{
    int i,t,x;
    for (i=1;i<=1000;i++)
    {
        a[i].index=i;
        a[i].divisor=number_of_divisors(i);
    }

    sort(a+1,a+10001,sortbydivisor);

    scanf("%d",&t);

    for (i=1;i<=t;i++)
    {
        scanf("%d",&x);
        printf("Case %d: %d\n",i,a[x].index);
    }

    return 0;
}

После компиляции я не получил никаких ошибок. Но после запуска я получил это предупреждение "программа перестала работать". В онлайн-компиляторах говорится: "Ошибка выполнения" :( почему?

Заранее спасибо за вашу помощь :).

  • 1
    Вы инициализируете тысячу записей в своем массиве, но пытаетесь отсортировать десять тысяч.
  • 0
    Вы должны начать свой первый цикл с i = 0, чтобы у вас не было [0] undefined, и это облегчает понимание вашего вызова сортировки, также, я думаю, + 10001 - это слишком много, есть 0 перебор. @Mike: Arr, 4 секунды слишком поздно.
Показать ещё 1 комментарий
Теги:
sorting
data-structures

3 ответа

0
Лучший ответ

Вы указали неверную верхнюю границу, поэтому sort пытается переместить несуществующие объекты после конца массива. Вы хотите

sort(a+1,a+1001,sortbydivisor);  // not 10001

В С++ 11 есть удобные функции библиотеки, чтобы избежать таких ошибок:

sort(std::begin(a) + 1, std::end(a), sortbydivisor);

отметив, что begin потребности немного bodging за счет индексации один-йоркского. Если вы не можете использовать библиотеку С++ 11, их легко написать:

template <typename T, size_t N> T * begin(T (&a)[N]) {return a;}
template <typename T, size_t N> T * end  (T (&a)[N]) {return a+N;}
  • 0
    Спасибо за все :)
1

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

Просто обратите внимание, что вы используете свои индексы непоследовательно (заканчивается на 1000) в вашем цикле инициализации и 10001 в алгоритме сортировки. Это выходит за рамки вашего массива.

  • 0
    Добро пожаловать.
0
sort(a+1,a+10001,sortbydivisor);

Глупые опечатки!

  • 0
    Да .. Верри глупо :(

Ещё вопросы

Сообщество Overcoder
Наверх
Меню