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

时间:2010-10-02 23:14:51

标签: 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;
}

17 个答案:

答案 0 :(得分:19)

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

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

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

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

Sum(1,N) = N*(N+1)/2

所以样本函数将是

unsigned int unitSum(unsigned int n)
{
    return (n*(n+1))/2;
}

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

3*unitSum((int)(999/3))

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

5*unitSum((int)(999/5))

但有一点需要注意!这两个都计算了两者的倍数,如15,30等 它计算两次,每次一个。所以为了平衡这一点,你减去一次。

15*unitSum((int)(999/15))

总的来说,等式是:

sum = 3*unitSum((int)(999/3)) + 5*unitSum((int)(999/5)) - 15*unitSum((int)(999/15))

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

答案 1 :(得分:18)

两件事:

  • 你在循环中包括 1000,
  • 你每次都要加一个,而不是价值本身。

将循环更改为

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

总和为

sum=sum+i;

答案 2 :(得分:7)

也许你应该做

sum += i // or sum = sum + i

而不是

sum = sum + 1

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

答案 3 :(得分:6)

应该是sum = sum + i而不是1

答案 4 :(得分:3)

#include<stdio.h>
#include<time.h>
int main()
{
    int x,y,n;
    int sum=0;
    printf("enter the valeus of x,y and z\n");
    scanf("%d%d%d",&x,&y,&n);
    printf("entered   valeus of x=%d,y=%d and z=%d\n",x,y,n);
    sum=x*((n/x)*((n/x)+1)/2)+y*((n/y)*((n/y)+1)/2)-x*y*(n/(x*y))*((n/(x*y))+1)/2;
    printf("sum is %d\n",sum);
    return 0;
}
// give x,y and n  as 3 5 and 1000

答案 5 :(得分:2)

这是一个蟒蛇单行,给出了正确的答案(233168):

reduce( lambda x,y: x+y, [ x for x in range(1000) if x/3.0 == int( x/3.0 ) or x/5.0 == int( x/5.0 ) ] )

答案 6 :(得分:2)

正如改进一样,您可能希望完全避免循环:

multiples of 3 below 1000 form an AP : 3k where k in [1, 333]
multiples of 5 below 1000 form an AP : 5k where k in [1, 199]

如果我们避免3和5的倍数:15k,其中k为[1,66]

So the answer is : 333*(3+999)/2 + 199(5+995)/2 - 66*(15+990)/2 = 2331 68

为什么你可能想要这样做是由你去弄明白的。

答案 7 :(得分:2)

这两种方法之间时间差异的有趣事实......第二种方法只计算所需的数字并且不迭代循环。 示例:3 *(1 + 2 + 3 + 4 ... 333)(因为3 * 333 = 999和999 <1000。

   static void Main(string[] args)
    {
        Stopwatch sw = new Stopwatch();

        Calc calculator = new Calc();
        long target = 999999999;
        sw.Start();
        Console.WriteLine("Result: " +  (calculator.calcMultipleSumFast(3,target) + calculator.calcMultipleSumFast(5, target) - calculator.calcMultipleSumFast(15, target)));
        sw.Stop();
        Console.WriteLine("Runtime: " + sw.Elapsed);
        Console.WriteLine();
        sw.Start();
        Console.WriteLine("Result: " + (calculator.calcMultiplesSum(3, 5,1000000000)));
        sw.Stop();
        Console.WriteLine("Runtime: " + sw.Elapsed);

        Console.ReadKey();
    }

    public class Calc
{
    public long calcMultiplesSum(long n1, long n2, long rangeMax)
    {
        long sum = 0;
        for (long i = 0; i < rangeMax; i++)
        {
            if ((i % n1 == 0) || (i % n2 == 0))
            {
                sum = sum + i;
            }
        }
        return sum;
    }

    public long calcMultipleSumFast(long n, long rangeMax)
    {
        long p = rangeMax / n;

        return (n * (p * (p + 1))) / 2;
    }
}

enter image description here

答案 8 :(得分:0)

#include <bits/stdc++.h>
using namespace std;

int main()
{
     int i,sum=0;                    //initialize sum with 0
    for(i=0;i<1000;i++)         //run loop from 0  999 (1000 is not included) because      
                                       //we want less than 1000.  
    {
        if(i%5==0||i%3==0)             //check if it satisfy one of the 
                                       //condition either 
                                        //it divides with 5 or 3 completely 
                                        //i.e remainder0 
        {                                     
            sum+=i;                      //increment sum by that number as 
                                             //particular number 
                                             //satisfy the condition 
        }
    }
    cout<<sum;                                 //print sum the value of sum
    return 0;
}

答案 9 :(得分:0)

我尝试了欧拉1号项目:3和5的倍数。为此获得了60分。

private static long euler1(long N) {
        long i, sum = 0;
        for (i = 3; i < N; i++) {
            if (i % 3 == 0 || i % 5 == 0) {
            sum += i;
            }
        }
        return sum;
    }

我使用Java,并且可以将这种逻辑用于C。我努力工作并找到了最佳解决方案。

private static void euler1(long n) {
        long a = 0, b = 0, d = 0;

        a = (n - 1) / 3;
        b = (n - 1) / 5;
        d = (n - 1) / 15;

        long sum3 = 3 * a * (a + 1) / 2;
        long sum5 = 5 * b * (b + 1) / 2;
        long sum15 = 15 * d * (d + 1) / 2;
        long c = sum3 + sum5 - sum15;
        System.out.println(c);
    }

答案 10 :(得分:0)

以声明方式思考-您想做什么,而不是想怎么做。

简而言之,它可以归结为问题要求您执行的操作:

  1. 找到3或5的所有倍数(在此情况下为1到1000)
  2. 将它们全部加起来(总计)

在LINQ中,它看起来像:

Enumerable.Range(1, 1000)
            .Where(x => (x % 3 == 0) || (x % 5 == 0))
            .Aggregate((accumulate, next) => accumulate += next);

现在,您可以将其转换为迭代解决方案-但使用上述声明式解决方案没有任何问题-因为它更清晰,简洁。

答案 11 :(得分:0)

int main(int argc, char** argv)
{
    unsigned int count = 0;
    for(int i = 1; i < 1001; ++i)
        if(!(i % 3) && !(i % 5))
            count += i;
    std::cout << i;
    return 0;
}

答案 12 :(得分:0)

使用步进方法,您可以制作一个版本:

#include <stdio.h>

int main ( void ) {

    int sum = 0;

    for (int i = 0; i < 1000; i += 5) {
        sum += i;
    }
    for (int i = 0; i < 1000; i += 3) {
        if (i % 5) sum += i;  /* already counted */
    }
    printf("%d\n", sum);
    return 0;
}

可以减少modulo次计算。

事实上,使用计数器,您可以创建一个没有的版本:

#include <stdio.h>

int main ( void ) {

    int sum = 0;
    int cnt = 6;

    for (int i = 0; i < 1000; i += 5) {
        sum += i;
    }
    for (int i = 0; i < 1000; i += 3) {
        if (--cnt == 0) cnt = 5;
        else sum += i;
    }
    printf("%d\n", sum);
    return 0;
}

答案 13 :(得分:0)

int Sum(int N) {
long long c = 0;
    N--; //because you want it less than 1000 if less than or equal delete this line
    int n = N/3,b = N/5,u = N/15;
    c+= (n*(n+1))/2 * 3;
    c+= (b*(b+1))/2 * 5;
    c-= (u*(u+1))/2 * 15;
    return c;
}

答案 14 :(得分:0)

Python实现的问题。短,精确,肥胖。

sum=0
for i in range(1000):
    if (i%3==0) or (i%5==0):
        sum=sum+i
print sum

答案 15 :(得分:0)

您可以从3(3,6,9,12等)开始,从1000迭代到3,然后将它们添加到sum之类的,

int i = 3, sum = 0;
for (; i < 1000; i += 3) {
  sum += i;
}

然后你可以51000迭代到5(跳过3的倍数,因为它们已被添加)将这些值添加到{{1还有

sum

然后显示for (i = 5; i < 1000; i += 5) { if (i % 3 != 0) sum += i; }

sum

答案 16 :(得分:-1)

package com.venkat.test;

public class CodeChallenge {

    public static void main(String[] args) {

        int j, sum=0;

        for ( j = 0; j <=1000; j++) {               
            if((j%5==0)||(j%3==0))
            {
                sum=sum+j;
            }               
        }           
        System.out.println(sum);            
    }    
}