Почему эта новая реализация [] и delete [] разбивается на целые числа> 12? - PullRequest
0 голосов
/ 06 октября 2019

Проблема: мне нужно напечатать треугольник Паскаля для любого (unsigned int) ввода, переданного в качестве аргумента командной строки. Все значения должны храниться в массиве LINEAR, а элементы должны обрабатываться только как разыменованные указатели. После этого элементы массива должны быть напечатаны в виде нижней треугольной матрицы и впоследствии удалены. Моя реализация отлично работает для ввода в диапазоне от 0 до 12, но дает ложные результаты для более высоких значений.

Я пробовал две разные реализации.

  1. Объявить указатель на массивsize (n + 1) * (n + 2) / 2 (это количество элементов в треугольнике для ввода 'n'). Назначать / печатать переменные во вложенном цикле. Удалите указатель после выполнения обоих циклов.

  2. Запустите вложенный цикл, 0 <= i <= n и 0 <= j <= i. Объявите указатель на массив размера (i + 1) во внешнем цикле. Назначать / печатать элементы во внутреннем цикле. Удалите указатель после выполнения внутреннего цикла. </p>

// VERSION 1
unsigned N = (n+1)*(n+2)/2;
  unsigned* elements = new unsigned[N];
  for(i = 0; i <= n; i++) {
    for(j = 0; j <= i; j++) {
      *(elements + j+(i*i+i)/2) = fact(i) / (fact(j) * fact(i-j));
          // print statement
    }
        cout << endl;
  }
delete [] elements;

// VERSION 2
for(i = 0; i <= n; i++) {
    unsigned* elements = new unsigned[i+1];
    for(j = 0; j <= i; j++) {
      *(elements + j) = fact(i) / (fact(j) * fact(i-j));
          // print statement
    }
    delete [] elements;
    cout << endl;
  }

Обе эти версии были опробованы в Xcode отдельно. В обоих случаях треугольник печатался правильно до 12-го слоя, то есть n = 12, но генерировал неверные результаты для более высоких значений.

0 | 1 
1 | 1 1 
2 | 1 2 1 
3 | 1 3 3 1 
4 | 1 4 6 4 1 
5 | 1 5 10 10 5 1 
6 | 1 6 15 20 15 6 1 
7 | 1 7 21 35 35 21 7 1 
8 | 1 8 28 56 70 56 28 8 1 
9 | 1 9 36 84 126 126 84 36 9 1 
10 | 1 10 45 120 210 252 210 120 45 10 1 
11 | 1 11 55 165 330 462 462 330 165 55 11 1 
12 | 1 12 66 220 495 792 924 792 495 220 66 12 1 
13 | 1 4 24 88 221 399 532 532 399 221 88 24 4 1 
14 | 1 0 1 5 14 29 44 50 44 29 14 5 1 0 1 
15 | 1 1 0 0 2 4 7 9 9 7 4 2 0 0 1 1 
16 | 1 0 0 0 0 4 0 1 1 1 0 4 0 0 0 0 1 

Отладчик, в той степени, в которой я могу его использовать, не выдавал ошибоксообщения.

Что происходит и как это исправить?

Ответы [ 2 ]

1 голос
/ 06 октября 2019

факт (я) переполняет очень быстро. Я не проверял числа, но я почти уверен, что именно так и происходит.

Вместо этого используйте тот факт, что число в треугольнике Паскаля является суммой двух чисел над ним.

В Википедии есть хорошая анимация для этого.

1 голос
/ 06 октября 2019

Когда i равно 13, fact(i) равно 6227020800, что слишком велико, чтобы поместиться в 32-разрядное целое число без знака, поэтому происходит переполнение целого числа.

...