为什么新的[]和delete []实现会破坏> 12的整数?

问题描述 投票:0回答:2

问题:我需要为作为命令行参数传递的任何(无符号int)输入打印Pascal三角形。所有值都必须存储在LINEAR数组中,并且元素只能作为取消引用的指针进行操作。此后,必须将数组元素打印为下三角矩阵,然后删除。我的实现对于0到12范围内的输入完美地起作用,但是对于更高的值会产生虚假结果。

我尝试了两种不同的实现。

  1. 声明一个指向大小为(n + 1)*(n + 2)/ 2(这是三角形中输入'n'的元素的数量)的数组的指针。在嵌套循环中分配/打印变量。一旦两个循环都已执行,请删除指针。

  2. 运行嵌套循环,0 <= i <= n,0 <= j <= i。在外循环中声明一个指向大小为(i + 1)的数组的指针。在内部循环中分配/打印元素。一旦执行了内部循环,就删除指针。

// 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 

在我可以使用的范围内,调试器未产生任何错误消息。

正在发生什么以及如何解决?

c++ arrays pointers new-operator delete-operator
2个回答
1
投票

[i为13时,fact(i)为6227020800,它太大而无法容纳32位无符号整数,因此发生整数溢出。


1
投票

事实(i)溢出非常快。我尚未核对这些数字,但我可以确定这是正在发生的事情。

相反,请使用Pascal三角形中的数字是其上方两个数字之和的事实。

维基百科对此具有nice animation

© www.soinside.com 2019 - 2024. All rights reserved.