低于1000的所有数字的总和是3或5的倍数

时间:2011-07-10 14:25:18

标签: c++ sum

Project Euler problem 1是:找到低于1000的所有3或5的倍数

这是我的程序,使用两个简单的函数计算出3的所有倍数和5的所有倍数之和,然后将它们相加:

#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <vector>
#include <cmath>
using namespace std;


int threeSum( void );

int fiveSum( void );


int main( int argc, char** argv )
{
    cout << "\n The sum of all the natural numbers below 1000 that are multiples of 3 or 5 = \n" << endl;

    cout << threeSum() + fiveSum() << endl << endl;

    system( "PAUSE" );
}


int threeSum( void )
{
    int sumSoFar = 0;

    for ( int i = 1 ; i < 1000 ; i++ )
    {
        if ( i % 3 == 0 )
                            sumSoFar = sumSoFar + i;
    }

    return sumSoFar;
}


int fiveSum( void )
{
    int sumSoFar = 0;

    for ( int i = 1 ; i < 1000 ; i++ )
    {
        if ( i % 5 == 0 )
                            sumSoFar = sumSoFar + i;
    }

    return sumSoFar;
}

生成266333作为答案。这是正确的,还是我做错了,因为网站检查员说这是错误的答案!

6 个答案:

答案 0 :(得分:7)

另一种看待这种情况的方法是:

回答=(3的乘数之和)+(5的乘数之和) - (15的倍数之和)

这些是简单的算术系列,因此您甚至不需要循环。

答案 1 :(得分:2)

你总结了15的所有倍数。这是一个简单的数学问题:

在15的情况下,因为它可以被3和5分割,所以你在两个函数中都计算了两次。

我建议你可以使用一个循环和||。当然,单个公式会更好,但那只是蹩脚,我怀疑你会喜欢它:))

顺便说一句,项目欧拉比纯编程更多的是数学/计算机科学,所以当有疑问时,试着以一种蹩脚的方式思考:)

答案 2 :(得分:2)

正如其他大多数人所指出的那样,你将两倍的倍数相加两倍。

只是提示另一种解决方案:

低于1000的3的倍数之和是

SUMBELOW(3,1000) = 3 + 6 + 9 + ... + 999 = 3*(1+2+3+...+333) = 3*333*(1+333)/2 = 3*((1000-1)/3)*(1+(1000-1)/3)/2

(所有部门都是整数除法......)

有类似的公式来计算5和15的倍数之和。要得到总体结果,你必须加上3和5的和,并减去15的总和...

答案 3 :(得分:1)

你的解决方案没有考虑到一些数字(如15)可以被5和3整除的事实。你要在你的总和中加两次。

答案 4 :(得分:1)

我的猜测是你重复计算3 5的常见倍数。

答案 5 :(得分:1)

查找包含 - 排除原则,它允许您在不使用循环的情况下回答此类问题!