7
votes

Trouvez la somme de tous les multiples de 3 ou 5 en dessous de 1000

Si nous répertorions tous les nombres naturels inférieurs à 10 10 multiples de 3 ou 5, nous obtenons 3, 5, 6 et 9. La somme de ces multiples est 23. J'ai le code suivant mais la réponse ne correspond pas.

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

c

2 commentaires

Peut-être que vous devriez créer un lien vers le premier problème du projet Euler? ( projecturer.net/index.php?section=problems&id=1 )


J'ai trouvé une solution Stackoverflow.com/a/53403964/9210255


17 Réponses :


7
votes

Peut-être que vous devriez faire xxx

au lieu de xxx

en outre, soyez prudent lors de l'impression longtemps non signé INT s avec printf. Je suppose que le bon spécificateur est % lu .


0 commentaires

6
votes

Il devrait être somme = somme + i au lieu de 1 .


0 commentaires

19
votes

Deux choses:

  • vous êtes y compris 1000 dans la boucle et
  • Vous en ajoutez une à la somme à chaque fois, plutôt que la valeur elle-même.

    changer la boucle sur xxx

    et la ligne de somme sur xxx


5 commentaires

Son imprimer des ordures.J'ai même changé Int vers longtemps int


Je reçois 233168 une fois que ces changements sont en place et un avertissement sur le format (voir la réponse de Hugo). Est-ce la bonne valeur?


Que dis-tu de ça? Stackoverflow.com/Questtions/4587320/...


Vous pouvez commencer la boucle de i = 3. Cela vous fera économiser trois itérations.


@Harshvardhan pendant que vous avez raison, vous pouvez également commencer par i = 5 et définir la somme sur 3 ... etc ... :-)



2
votes

Voici un python one-liner qui donne la bonne réponse (233168): xxx


1 commentaires

Le code: si x / 3.0 == int (x / 3.0) ou x / 5.0 == int (x / 5.0) peut être simplement apporté à si x% 3 == 0 ou x% 5 == 0 0



3
votes
#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

2 commentaires

Cette solution est générique à tous les cas.


Essayez sans nombres premiers x et y, disons 4 et 10



2
votes

Tout comme une amélioration, vous voudrez peut-être éviter la boucle tout à fait:

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]


0 commentaires

-1
votes
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);            
    }    
}

0 commentaires

0
votes

Vous pouvez commencer par itération à partir de 3 à 1000 par étapes de 3 (3,6,9,12, etc.), ajoutant à la somme Somme comme, xxx

alors vous pouvez itérer à partir de 5 à 1000 par 5 (sauter des multiples de 3 car ils ont déjà été ajoutés) Ajout de ces valeurs au Somme aussi bien xxx

Affiche ensuite la somme somme xxx


0 commentaires

0
votes

Mise en œuvre de Python du problème. Court, précis et gras.

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


0 commentaires

21
votes

Plutôt que d'utiliser des solutions à base de gamme / boucle, vous pouvez tirer parti de plus de mathématiques que la force brute.

Il existe un moyen simple d'obtenir la somme des multiples d'un nombre, inférieur à un nombre. P> Par exemple, la somme des multiples de 3 jusqu'à 1000 sont les suivantes: 3 + 6 + 9 + ... + 999 Qui peut être réécrit comme suit: 3 * (1 + 2 + 3 + ... + 333) P>

Il existe un moyen simple de résumer tous les chiffres 1-N: P>

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


0 commentaires

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

0 commentaires

1
votes

Utilisation de l'approche progressive, vous pouvez créer une version: xxx

qui fait un lot entier moins modulo calculs.

en fait , avec un compteur, vous pouvez faire une version sans: xxx


0 commentaires

2
votes

Fait intéressant de la différence de temps entre ces 2 méthodes ... La deuxième méthode ne fait que calculer uniquement avec les numéros nécessaires et ne pas itérer à travers une boucle. Exemple: 3 * (1 + 2 + 3 + 4 + 4 ... 333) (parce que 3 * 333 = 999 et 999 <1000. xxx

 Entrez la description de l'image ici


0 commentaires

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

0 commentaires

0
votes

Pensez déclarer - ce que vous voulez faire, plutôt que de la façon dont vous voulez faire.

En langage clair, il se résume exactement à ce que le problème vous demande de faire:

  1. Trouvez tous les multiples de 3 ou 5 dans une certaine plage (dans ce cas 1 à 1000)
  2. ajoutez-les tous (sommet)

    en linq, on dirait: xxx

    maintenant, vous pouvez convertir cela en une solution itérative - mais il n'y a rien de mal à utiliser une solution déclarative Comme ci-dessus - parce qu'il est plus clair et succinct.


0 commentaires

1
votes

Je tente le projet Euler # 1 fort>: multiples de 3 et 5. et a eu 60 points pour cela.

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


0 commentaires

1
votes
#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;
}

1 commentaires

S'il vous plaît ne publiez pas uniquement le code comme réponse, mais fournissez également une explication de votre code et de la manière dont il résout le problème de la question. Les réponses avec une explication sont généralement plus utiles et de meilleure qualité, et sont plus susceptibles d'attirer des upvotes.