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;
}
17 Réponses :
Peut-être que vous devriez faire au lieu de p> en outre, soyez prudent lors de l'impression longtemps non signé INT code > s avec printf. Je suppose que le bon spécificateur est % lu code>. P> p>
Il devrait être somme = somme + i code> au lieu de 1 code>. p>
Deux choses:
changer la boucle sur p> et la ligne de somme sur p>
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?
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 ... :-)
Voici un python one-liner qui donne la bonne réponse (233168):
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
#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
Cette solution est générique à tous les cas.
Essayez sans nombres premiers x et y, disons 4 et 10
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]
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);
}
}
Vous pouvez commencer par itération à partir de alors vous pouvez itérer à partir de Affiche ensuite la somme 3 code> à 1000 code> par étapes de 3 code> (3,6,9,12, etc.), ajoutant à la somme Somme code> comme, 5 code> à 1000 code> par 5 code> (sauter des multiples de 3 code> car ils ont déjà été ajoutés) Ajout de ces valeurs au Somme code> aussi bien p> somme code> p>
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
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))
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;
}
Utilisation de l'approche progressive, vous pouvez créer une version: qui fait un lot entier moins en fait , avec un compteur, vous pouvez faire une version sans: p> modulo code> calculs. p>
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.
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;
}
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: p>
en linq, on dirait: p> 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. p> p>
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);
}
#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;
}
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.
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