问题:我需要为作为命令行参数传递的任何(无符号int)输入打印Pascal三角形。所有值都必须存储在LINEAR数组中,并且元素只能作为取消引用的指针进行操作。此后,必须将数组元素打印为下三角矩阵,然后删除。我的实现对于0到12范围内的输入完美地起作用,但是对于更高的值会产生虚假结果。
我尝试了两种不同的实现。
声明一个指向大小为(n + 1)*(n + 2)/ 2(这是三角形中输入'n'的元素的数量)的数组的指针。在嵌套循环中分配/打印变量。一旦两个循环都已执行,请删除指针。
运行嵌套循环,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
在我可以使用的范围内,调试器未产生任何错误消息。
正在发生什么以及如何解决?
[i
为13时,fact(i)
为6227020800,它太大而无法容纳32位无符号整数,因此发生整数溢出。