我帕斯卡的三角形有什么问题?

时间:2011-12-15 23:26:45

标签: objective-c c math pascals-triangle

我最近一直在寻找一些简单的编码挑战,并发现了Pascal的三角形(here),我试图在C / Objective-C中自己生成一个。对于那些不知道它是什么的人,这个链接很好地解释了它。

在第四排之后我开始变得奇怪了,我只是想不出原因。

我的5次迭代输出目前看起来像这样:

   1      
  1 1     
 1 2 1    
1 3 3 1   
 4 6 3 1

它应该是这样的:

    1
   1 1
  1 2 1
 1 3 3 1
1 4 6 4 1

到目前为止,这是我的代码。第一个循环只是一个重置循环(将所有值设置为0)。实际逻辑主要发生在第二个循环中。第三个循环是值连接并以字符串格式化的地方。

为了帮助提高可读性,我对这段代码的评论远远超过了我自己的评论。

int iterations, i, b, mid, chars, temp;
NSLog(@"Please enter the number of itereations");
scanf("%i",&iterations); // take users input and store it in iterations

// calculate where the first 1 should go.
if (iterations % 2 == 0) mid = (iterations)/2;
else mid = (iterations+1)/2;

chars = iterations*2;

int solutions[iterations][chars];

// reset loop
for (i = 0; i<iterations; i++) {
    for (b = 0; b<chars; b++) {
        solutions[i][b] = 0;
    }
}

solutions[0][mid] = 1; // place the initial 1 in first row

for (int row = 1; row<iterations; row++) {
    for (int chi = 0; chi<chars; chi++) {
        temp = 0;
        if (chi > 0) {
            temp += solutions[row-1][chi-1]; // add the one diagonally left
        }
        if (chi < iterations) {
            temp += solutions[row-1][chi+1]; // add the one diagonally right
        }
        solutions[row][chi] = temp; // set the value
    }
}

// printing below...

NSMutableString *result = [[NSMutableString alloc] initWithString:@"\n"];
NSMutableString *rowtmp;

for (i = 0; i<iterations; i++) {
    rowtmp = [NSMutableString stringWithString:@""];
    for (b = 0; b<chars; b++) {
        if (solutions[i][b] != 0) [rowtmp appendFormat:@"%i",solutions[i][b]];
        else [rowtmp appendString:@" "]; // replace any 0s with spaces.
    }
    [result appendFormat:@"%@\n",rowtmp];
}

NSLog(@"%@",result);
[result release];

我有一种感觉问题可能与偏移有关,但我不知道如何解决它。如果有人能够发现我的代码出错的地方,那就太好了。

1 个答案:

答案 0 :(得分:1)

看起来(简要来看)原始中点计算不正确。我认为应该只是:

mid = iterations - 1;

在5次迭代的示例中,中点需要位于数组位置4.每次迭代“向左移动”一个位置。第二次迭代(第二行)然后在位置3和5处放置1.第三次迭代在2和6.第四次在1和7.第五次和最后一次迭代将在0和8处填充1。 / p>

此外,临时添加的第二个if语句应如下所示,否则它将读取超出数组边界的结尾:

if (chi < iterations - 1) {