Я новичок. Я пытался изучить использование необязательного третьего параметра функции 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;
}
После компиляции я не получил никаких ошибок. Но после запуска я получил это предупреждение "программа перестала работать". В онлайн-компиляторах говорится: "Ошибка выполнения" :( почему?
Заранее спасибо за вашу помощь :).
Вы указали неверную верхнюю границу, поэтому 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;}
Это трудно понять, но если вы компилируете и запускаете в отладке, вы должны иметь возможность получить стек вызовов, чтобы определить, где ваша программа потерпела неудачу, и которая должна предоставить вам информацию, в которой ваша программа терпит неудачу.
Просто обратите внимание, что вы используете свои индексы непоследовательно (заканчивается на 1000) в вашем цикле инициализации и 10001 в алгоритме сортировки. Это выходит за рамки вашего массива.
sort(a+1,a+10001,sortbydivisor);
Глупые опечатки!