#c #runtime-error #segmentation-fault
#c #время выполнения-ошибка #ошибка сегментации
Вопрос:
## Here is the link to the question http://www.spoj.com/problems/SBANK/
## i am getting sigsev error on the spoj.i have used mergesort to sort the account number ##
#include<stdio.h>
#include<string.h>
void merge(int,int,int);
char a[10000][33];
** Функция слияния для сортировки массива. Поскольку номер учетной записи превышает 18 цифр, я использовал функцию библиотеки строк для сравнения номеров учетных записей, хранящихся в строке **
void mergesort(int low,int high)
{ int mid;
if(high>low)
{
mid=(high low)/2;
mergesort(low,mid);
mergesort(mid 1,high);
merge(low,mid,high);
}
else
return;
}
void merge(int low,int mid,int high)
{
int i=low;
int j=mid 1;
int k=0;
char temp[10000][33];
while(i<=midamp;amp;j<=high)
{
if(strcmp(a[i],a[j])<0)
{
strcpy(temp[k],a[i]);
i ;
}
else
{
strcpy(temp[k],a[j]);
j ;
}
k ;
}
while(i<=mid)
{
strcpy(temp[k],a[i]);
k ;
i ;
}
while(j<=high)
{
strcpy(temp[k],a[j]);
k ;
j ;
}
k=0;
while(low<=high)
{
strcpy(a[low],temp[k]);
low ;
k ;
}
}
Основная функция управления
В одном из интернет-банков ежедневно выполняются тысячи операций. Поскольку некоторые клиенты ведут бизнес более активно, чем другие, некоторые банковские счета встречаются много раз в списке операций. Ваша задача — отсортировать номера банковских счетов в порядке возрастания. Если учетная запись появляется в списке дважды или более, запишите количество повторений сразу после номера учетной записи. Формат счетов следующий: 2 контрольные цифры, 8-значный код банка, 16 цифр, идентифицирующих владельца (записанных группами по четыре цифры), например (в конце каждой строки ровно один пробел): 30 10103538 2222 1233 6160 0142
Банки — это учреждения реального времени, и им нужны БЫСТРЫЕ решения. Если вы чувствуете, что можете справиться с задачей в очень сжатые сроки, вперед! Хорошо разработанный алгоритм сортировки на быстром языке, скорее всего, будет успешным.
int main()
{
int t;
scanf("%d",amp;t);
while(t--)
{
int i,n;
int ch;
scanf("%d",amp;n);
getchar();
for(i=0;i<n;i )
gets(a[i]);
printf("n");
mergesort(0,n-1);
int j=1;
for(i=0;i<n-1;i )
{
if(strcmp(a[i],a[i 1])==0)
{ j ;
continue;
}
else
{
printf("%s %dn",a[i],j);
j=1;
}
}
printf("%s %dn",a[i],j);
}
return 0;
}
[Problem to sort bank accounts number of 26 digit][1]
Ответ №1:
Вероятно, один из ваших массивов фиксированного размера переполняется, если строки длиннее 32 символов или их более 10000.
Доступ к данным по индексу, который не был должным образом инициализирован, также может привести к чтению вне пределов.
Комментарии:
1. Хотя
mergesort()
это явно рекурсивно, если я не читаю код совершенно неправильно, не похоже, что когда-либо будет более одного экземпляраmerge()
active одновременно (похоже, это конечная функция, за пределами вызововstr*()
), поэтому рекурсивное накопление больших кадров стека, вероятно, не проблема. Тем не менее, 330 КБ по-прежнему является безумно большим стековым фреймом… Также есть много<=
сравнений, которые заставляют меня с большим подозрением относиться к доступам к массиву за пределами…2. @twalberg: Да, вы правы,
merge
не вызывается рекурсивно.3. @twalberg Даже при использовании быстрой сортировки выдает ошибку времени выполнения. Помогите, пожалуйста!
4. @user3135098 Просить нас отладить вашу полную программу выходит за рамки этого сайта. Используйте отладчик или вставьте код трассировки, чтобы сузить область проблемы; затем, если у вас есть конкретный вопрос о том, почему что-то происходит так, как происходит, не стесняйтесь спрашивать.