【问题标题】:Can't Understand this line in Pascal's Triangle for C++Can't understand this line in Pascal's Triangle for C++
【发布时间】:2015-01-06 19:14:32
【问题描述】:

我必须编写一个代码来生成一个有 12 行的帕斯卡三角形。

我自己写了所有东西,除了一部分,那是我们用来生成数字的公式。问题是我不明白我们的计数器和生成的数字之间有什么联系(因为我们正在使用我们的计数器。)。

#include <iostream>
#include <string>

using namespace std;

int main() {
    const int rows=12;
    int padding, value, fxValue;

    for(int rowCounter=0; rowCounter<rows; rowCounter++)
    {
        fxValue=1;
        cout << string((rows-rowCounter)*6, ' ');

        for(int fxCounter=0; fxCounter<=rowCounter; fxCounter++)
        {
            value=fxValue;
            fxValue = fxValue*(rowCounter-fxCounter)/(fxCounter+1);

//          cout << "fxCounter: "<< fxCounter << endl
//               << "rowCounter: " << rowCounter << endl
//               << "fxCounter: " << fxCounter << endl
//               << "fxValue: " << fxValue << endl;

            padding=fxValue/10;

            if(padding==0) cout << value << string(11, ' ');
            else if(10>padding) cout << value << string(10, ' ');
            else if(padding>10) cout << value << string(9, ' ');
        }
        cout << endl;
    }
    return 0;
}

问题来了:

fxValue = fxValue*(rowCounter-fxCounter)/(fxCounter+1);

有人可以解释一下作者是如何想到使用这些变量的想法以及它如何正常工作的吗?

【问题讨论】:

  • 很好的例子说明为什么好的变量名很重要。
  • I've written everything on my own except one part, That's the formula we use to generate numbers 这不是你作业中最重要的部分吗?
  • @PaulMcKenzie 哈哈是的,这就是我问你的原因

标签: c++ pascals-triangle


【解决方案1】:

这是因为帕斯卡三角形可以用二项式系数表示:

您的代码中的这个公式基于这样一个事实,即在相同的 n 索引上(在帕斯卡的三角形情况下,同一行),为了获得下一个元素 (k -> k+1),我们需要将当前值乘以 (n-k)/(k+1):

如果您想说服自己,这很容易证明。 因此,您可以通过此操作从上一个值中获取下一个值。

【讨论】:

  • 请注意,这是整数乘法运算的左结合性很重要的一种情况,并且(以不同的方式陈述相同的事情)fxValue *= (rowCounter-fxCounter)/(fxCounter+1);不会给出正确的结果(那么划分通常是不准确的)。因此,“将当前值乘以 (n-k)/(k+1)”应该具有数学而非计算的意义。
  • @MarcvanLeeuwen 你的意思是我应该使用双精度而不是整数还是什么?我没有得到你! (对不起,我的英语)
  • 我的意思是(对于整数变量 n,k,val)声明 val = val * (n-k) / (k-1)val *= (n-k) / (k-1) 的效果不同。后者等价于val = val * ((n-k) / (k-1)),在其中完成乘法之前执行现在括号内的除法。但在后一种形式中,除法不准确,余数被丢弃,导致结果错误。然而,在前一种形式val = (val * (n-k)) / (k-1)(为了清楚起见,我在其中添加了隐式括号)首先进行乘法运算,因此除法始终是精确的。
  • @MarcvanLeeuwen 谢谢
猜你喜欢
  • 2013-11-11
  • 1970-01-01
  • 2020-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-02
  • 2022-01-12
相关资源
最近更新 更多