Почему ошибки времени выполнения?Я уже давно установил инт - PullRequest
0 голосов
/ 05 февраля 2019
#include <stdio.h>

long equation(long x){
  return x*x+x;
}

long BinarySearch(long arr[],long start,long end,long k){

  if(start==0 && end==0){
    return 0;
  }
  else if((end-start)<=5){
    for(int i=start;i<=end;i++){
      if(arr[i]<=k && arr[i+1]>k){
        return i;
      }
    }
  }
  else{
    long mid=(start+end)/2;
    if(arr[mid]==k){
      return mid;
    }
    else if(arr[mid]>k){
      return BinarySearch(arr,start,mid-1,k);
    }
    else{
      return BinarySearch(arr,mid+1,end,k);
    }
  }

}

int main() {

  long a;
  scanf("%ld",&a);
  long roots[a];
  for(long i=0;i<a;i++){
    roots[i]=equation(i);
  }

  printf("%ld",BinarySearch(roots,0,a-1,a));

  return 0;
}

Для небольших чисел (до 100000000) этот код работает, но при превышении 100000000 этот код имеет ошибку во время выполнения.Я установил все переменные как long int ... Я использовал c ++ tutor, он сказал, что у шага в длинном уравнении есть проблема.Неверная запись размера 8 ... Почему?

1 Ответ

0 голосов
/ 05 февраля 2019

длинные корни [a];

Это массив переменной длины .Что не является частью стандарта C ++.(Но компиляторы GNU поддерживают его. И это часть C99 и C11- , опционально ).Не зная, как это реализовано.Но что бы это ни было, оно не может содержать столько длинных целых.

позволяет решить математическую задачу.Предположим, что 1MB = 10**6 Bytes, размер long int равен 4 байта, тогда 100000000 long занимает 400 МБ памяти.Я не думаю, что он может храниться в стеке, который обычно составляет 4 МБ.

И вы сказали, что вы использовали long int .Но в большинстве компиляторов нет разницы между int и long (хотя это может не иметь отношения к этому вопросу).

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

...