Stroustrup的C ++图书挑战,有人可以帮助我理解此代码吗?

时间:2019-10-18 01:51:40

标签: c++

我从Stroustrup的书中看到了这段代码,但是我不明白它是如何工作的。 我只是不知道它如何增加“ 0、1、4、9 ...”

int archaic_square(int v) {
    int total = 0;

    for (int i = 0; i < v; ++i) {
        total += v;
    }
    return total;
}

int main() {
    for (int i = 0; i < 100; ++i) {
        cout << i << '\t' << archaic_square(i) << '\n';
    }
    return 0;
}

3 个答案:

答案 0 :(得分:1)

archaic_square中的代码从total开始为零,然后向其v添加v次(在循环中)。

根据定义,它将最终显示为:

0 + v + v + … + v
    \___________/
       v times

0 + v * vv2

更明确的细节:

  • 将零归零,零次,得到零(0);
  • 一次加一到零,就得到一(0,1);
  • 将零加二,两次,得到四个(0、2、4);
  • 将3加零,三遍,得到九(0、3、6、9);
  • 四到零,四次相加,得到十六(0、4、8、12、16);
  • 等等,是无限的。

答案 1 :(得分:1)

从算术中还记得乘法只是重复加法(或者按照定义是重复加法)吗?这就是这里正在发生的一切。

由于v被添加了v次,因此它与v * v相同,或者等于v的平方。

答案 2 :(得分:0)

该代码通过差异方法计算平方。这是一种评估功能的替代方法,与常规的“按价值插入”方法相比,具有一些优势。它被用在Babbage的difference engine中,后者是在1800年代初设计的,用于计算对数,trig函数等至40(!)位的数学表。

基本思想是从知道如何求值的值列表开始。您可以从每个值的邻近值中减去每个值,从而为您提供第一组差异列表。然后,从其相邻的差值中减去每个差值,从而提供第二个差的列表。继续直到达到所有差值都相等的水平。对于二阶多项式(例如x ^ 2),第二个差将全部相等。对于三阶多项式,三阶差将全部相等。依此类推。

因此,要计算平方,您将得到以下结果:

Value    First Difference    Second Difference
  0
  1            1
  4            3                   2
  9            5                   2
 16            7                   2
 25            9                   2

现在您可以撤消该过程。从0的结果开始。加上第一个差(1),得出下一个结果(1)。然后,将第一差增加第二差(2),得到下一个第一差(3);将其添加到上一个结果(1),得到下一个结果(4)。然后将新的第一差异(3)增加第二差异(2),得到下一个第一差异(5);将其添加到上一个结果(4),得到下一个结果(9)。继续直到完成。

因此,仅使用第一个值(0),第一个差(1)和(恒定)第二个差(2),我们就可以生成所需的正方形列表。

当您需要结果的列表时,像这样用一个接一个的计算结果将乘法替换为加法,这在过去非常快。此外,如果一台计算机(当计算机是做繁琐的计算以产生数学的人时)犯了一个错误,那么该错误之后的所有结果也将是错误的,因此负责该项目的数学家不必提供检查每个结果的方法;抽查就足够了。

当然,计算触发函数会比较棘手,因为它们不是由多项式定义的。但是在足够小的区域上,可以用多项式近似它们。

Babbage的引擎将计算出40位数字的值,最多可达到7级差异。它机械地完成了我上面提到的步骤,以几秒钟一次的速度得出结果。巴贝奇实际上并没有建立完整的差异引擎。他的灵感来自更强大的“分析引擎”,但他也从未制造过。它将是现代数字计算机的先驱,它具有1000个40位存储单元,一个算术处理器和打孔卡来控制操作顺序。