如果我们列出10以下的所有自然数[C ++]

时间:2015-08-29 22:50:04

标签: c++

我所做的代码是为了解决以下问题。然而,代码的逻辑是错误的,我作为一个好新手无法想象有什么不对。 在编译之后,'sum'的结果总是为0,如果我为任何数字更改'sum'的初始化,那么无论是什么数字都显示为'sum'的答案。

如果我们列出10以下的所有自然数是3或5的倍数,我们得到3,5,6和9.这些倍数的总和是23.

查找低于1000的3或5的所有倍数的总和。

#include <iostream>
using std::cout;
using std::endl;

int main()
{
    long sum = 0;

    for( long i; i < 1000; ++i )
    {
        if (( i % 3 == 0 ) || ( i % 5 == 0 ))
        {   
            sum = sum + i;
        }

    }
cout << "The sum is: " << sum << endl;

    return 0;
}

4 个答案:

答案 0 :(得分:1)

您需要在循环中初始化i

for (long i = 0; i < 1000; ++i )

实际上,我可能是循环顶部大于0的随机数,结果是循环永远不会被执行。

答案 1 :(得分:0)

您需要将i初始化为零,否则i的值将是内存中发生的任何值。在这种情况下,它是&gt; 1000。

for (long i = 0; i < 1000; ++i)

另外,我学到了一个很好的技巧。使用ii作为索引变量。在代码中查找ii比在i更容易。

答案 2 :(得分:0)

你忘了在你的循环中设置i = O,所以循环不会迭代。

答案 3 :(得分:-1)

以上所有答案都是正确的 - 您需要将i设置为0。您可能感兴趣的是访问未初始化的变量是一个“未定义的行为”(UB),而现代编译器实际上非常适合查找UB并使用它们来优化代码。例如,带有-O2的GCC 5.2(已启用优化)将为您的代码生成相同的程序集,并为 所有的循环生成 >无论i地址的内存中发生了什么。

尝试将此代码放入(为方便起见,您的代码附加#ifthis online disassembler

#include <iostream>
using std::cout;
using std::endl;

int main()
{
        long sum = 0;

  #if 1
        for (long i; i < 1000; ++i)
        {
            if ((i % 3 == 0) || (i % 5 == 0))
            {
                sum = sum + i;
            }

        }
  #endif
        cout << "The sum is: " << sum << endl;

        return 0;
}

-O2标志添加到右上角的编译器选项,并尝试将#if 1更改为#if 0,并观察反汇编与编译器完全切断循环的意义相同。 / p>