Найти сумму всех кратных 3 или 5 ниже 1000

Если мы перечислим все натуральные числа ниже 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;
}
 pmg03 окт. 2010 г., 01:19
Может быть, вам стоит обратиться к первой проблеме Project Euler? (projecteuler.net/index.php?section=problems&id=1 )
 TigerTV.ru21 нояб. 2018 г., 04:30
Я нашел решениеstackoverflow.com/a/53403964/9210255

Ответы на вопрос(15)

sum = sum + i вместо1.

Реализация проблемы на Python. Короткий, точный и толстый.

sum=0
for i in range(1000):
    if (i%3==0) or (i%5==0):
        sum=sum+i
print sum
 John Hascall05 февр. 2016 г., 20:33
Вопрос помечен 'c' ...

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 = 233168

Почему вы, возможно, захотите это сделать, оставлено на ваше усмотрение.

ой метод просто вычисляет только с необходимыми числами и не повторяет цикл. Пример: 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;
    }
}

Проще говоря, это сводится к тому, что именно просит вас сделать проблема:

Найти все кратные 3 или 5 в определенном диапазоне (в данном случае от 1 до 1000)Сложите их все (общая сумма)

В LINQ это выглядит так:

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

Теперь вы можете преобразовать это в итеративное решение - но нет ничего плохого в использовании декларативного решения, как описано выше - потому что оно более ясное и краткое.

Используя пошаговый подход, вы можете сделать версию:

#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;
}
#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
 TigerTV.ru21 нояб. 2018 г., 02:40
Попробуйте без простых чисел х и у, скажем, 4 и 10
 Sachin Godara15 июл. 2015 г., 16:11
Я думаю, что это даст неправильный вывод, попробуйте.
 anil kumar03 апр. 2013 г., 12:04
Это решение является общим для всех случаев.

вы можете использовать больше математики, чем грубой силы.

Существует простой способ получить сумму, кратную числу, меньше числа.

Например, сумма, кратная 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))

Так что теперь вместо того, чтобы циклически проходить по большому набору чисел и делать сравнения, вы просто делаете некоторое простое умножение!

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;
}

Возможно, вам следует сделать

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

вместо

sum = sum + 1

Кроме того, будьте осторожны при печатиlong unsigned intс печатью. Я думаю, правильный указатель%lu.

 Fahad Uddin03 окт. 2010 г., 01:30
забыл% lu спасибо
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;
}
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);            
    }    
}
 John Hascall05 февр. 2016 г., 20:33
Вопрос помечен 'c' ...

Вы можете начать с итерации3 в1000 по шагам3 (3,6,9,12 и т. Д.), Добавив их вsum лайк,

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

Тогда вы могли бы перебрать5 в1000 от5 (пропуская кратные3 так как они уже были добавлены) добавление этих значений вsum также

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

Затем отобразитеsum

printf("%d\n", sum);

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 ) ] )
 billpcs07 окт. 2014 г., 17:30
Код: если x / 3.0 == int (x / 3.0) или x / 5.0 == int (x / 5.0), то можно просто сделать, если x% 3 == 0 или x% 5 == 0
Решение Вопроса

Выв том числе 1000 в цикле, иВы добавляете один к сумме каждый раз, а не само значение.

Измените цикл на

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

И сумма строки до

sum=sum+i;
 Steve Jessop03 окт. 2010 г., 01:53
да, это правильный ответ (согласно Project Euler).
 Faizan Mubasher19 янв. 2014 г., 15:24
Как насчет этого?stackoverflow.com/questions/4587320/...
 martin clayton03 окт. 2010 г., 01:24
Я получу 233168, как только эти изменения будут внесены, и предупреждение о формате (см. Ответ Хьюго). Это правильное значение?
 Harsh Vardhan21 авг. 2014 г., 12:48
Вы можете начать цикл с i = 3. Это сэкономит вам три итерации.
 Ring Ø22 мар. 2019 г., 06:38
@HarshVardhan Хотя вы правы, вы также можете начать с i = 5 и установить сумму в 3 ... и т.д ... :-)
 Fahad Uddin03 окт. 2010 г., 01:20
Это выводит мусор. Я даже изменил int на long int

Ваш ответ на вопрос