求出1000以下3或5的所有倍数的总和

fud*_*din 6 c

如果我们列出10以下的所有自然数是3或5的倍数,我们得到3,5,6和9.这些倍数的总和是23.我有以下代码,但答案不匹配.

#include<stdio.h>
int main()
{
    long unsigned int i,sum=0;
    clrscr();
    for(i=0;i<=1000;i++)
    {
        if((i%5==0)||(i%3==0))
        {
            sum=sum+1;
        }
    }
    printf("%d\n",sum);
    getchar();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

小智 20

而不是使用基于范围/循环的解决方案,您可能希望利用更多的数学而不是暴力.

有一种简单的方法可以得到一个数的倍数之和,小于一个数.

例如,3到1000的倍数之和为:3 + 6 + 9 + ... + 999可以改写为:3*(1 + 2 + 3 + ... + 333)

有一种简单的方法来总结所有数字1-N:

Sum(1,N) = N*(N+1)/2
Run Code Online (Sandbox Code Playgroud)

所以样本函数就是

unsigned int unitSum(unsigned int n)
{
    return (n*(n+1))/2;
}
Run Code Online (Sandbox Code Playgroud)

因此现在将所有3的倍数小于1000(也就是999)减少到:

3*unitSum((int)(999/3))
Run Code Online (Sandbox Code Playgroud)

您可以对5的倍数执行相同的操作:

5*unitSum((int)(999/5))
Run Code Online (Sandbox Code Playgroud)

但有一个警告!这两个都计算两者的倍数,例如15,30等等.它们计算两次,每次一个.因此,为了平衡这一点,你减去一次.

15*unitSum((int)(999/15))
Run Code Online (Sandbox Code Playgroud)

所以总的来说,等式是:

sum = 3*unitSum((int)(999/3)) + 5*unitSum((int)(999/5)) - 15*unitSum((int)(999/15))
Run Code Online (Sandbox Code Playgroud)

所以现在而不是循环遍历大量数字,并进行比较,你只是做一些简单的乘法!


mar*_*ton 18

两件事情:

  • 你在循环中包含了 1000,并且
  • 你每次都要加一个,而不是价值本身.

将循环更改为

for(i=0;i<1000;i++)
Run Code Online (Sandbox Code Playgroud)

和总和来

sum=sum+i;
Run Code Online (Sandbox Code Playgroud)

  • 是的,这是正确的答案(根据项目欧拉). (2认同)

Hug*_*oto 7

也许你应该这样做

sum += i // or sum = sum + i
Run Code Online (Sandbox Code Playgroud)

代替

sum = sum + 1
Run Code Online (Sandbox Code Playgroud)

另外,long unsigned int使用printf 打印时要小心.我想正确的说明符是%lu.


Eri*_*tin 6

它应该是sum = sum + i代替1.