Overblog
Editer l'article Suivre ce blog Administration + Créer mon blog
19 mai 2011 4 19 /05 /mai /2011 20:04

Bon début, d'une longue, longue série...

 

Le challenge Nr. 1 :

 

 
Ho, facile !
 
1) La méthode brute

Ben en SQL il faut :
- générer les 1000 premier entiers
(
  - filtrer les non multiples de 3 et / ou de 5 et sommer
OU
  - sommer en annulant les non multiples de 3 et / ou de 5
)
Sans discussion, la deuxième solution est la plus proche de la philosophie du PacBlog !
 
SQL> SELECT sum(level * greatest(0, 1 - mod(level, 3) * mod(level, 5)))
  2  FROM DUAL
  3  CONNECT BY level <= 1000
  4  /

SUM(LEVEL*GREATEST(0,1-MOD(LEVEL,3)*MOD(LEVEL,5)))
--------------------------------------------------
                                            234168

- On génère les 1000 premiers entiers
- On les aditionne... avec une astuce :
  - s'ils sont multiples, le reste est 0 et le facteur est neutre
 - s'il ne sont pas multiple,1 - le produit des mods est strictement négatif, et on multiplie par 0... 
 
2) La méthode mathématique

Ben on sait additionner les nombre de 1 à N : N (N+1) / 2
(la piste de démo est : en les couplant deux à deux symétriquement par rapport au milieu, c'est comme multiplier le terme du milieu par 2)
 
Sachant que sommer des multiples de 3 (resp. 5)... c'est comme sommer des entiers consécutifs puis les multiplier par 3 (resp. 5) (vive la distributivité !), il suffit de :
- sommer les multiples de 3
- sommer les multiples de 5
- ah zut il y en a qu'on a ajoutés deux fois... ce sont les multiples de 3 et de 5 : on retranche les multiples de 3 et de 5 (ça vous rappelle pas une formule de patates ?)  
Ce qui donne :
 
SQL> SELECT
  2      trunc (1000/3) * (trunc (1000/3) + 1) / 2 * 3
  3     + trunc (1000/5) * (trunc (1000/5) + 1) / 2 * 5
  4     - trunc (1000/15) * (trunc(1000/15) + 1) /2 * 15 as res
  5  FROM DUAL
  6  /

       RES
----------
    234168

Attendez, je cherche une conclusion à tout cela...
Ho !
 
La mort, n'est qu'une étape de la vie !
EDIT : merci Keeh pour ta vigilance !
Partager cet article
Repost0

commentaires

L
<br /> Ah oui, j'avais oublié que 1000 se divisait par 5 :)<br /> <br /> La méthode 2 est cool!<br /> <br /> <br />
Répondre
P
<br /> <br /> C'est clair que ça fait toujours plaisir de trouver une solution purement calculatoire (et non algorithmique)...<br /> <br /> <br /> (Sinon pour le 1000 je m'en suis aperçu seulement après avoir corrigé mon calcul, en constatant une différence avec ton résultat... de 1000 :D)<br /> <br /> <br /> <br />
L
<br /> La méthode papier crayon :<br /> Entre 1 et 15 on a 3,5,6,9,10,12,15 = 15 chiffres<br /> 1000 div 15 = 66<br /> 66*15 = 990<br /> en prennant les 6 premiers et 6 derniers de la série on a<br /> 990+987+985+984+981+980+978+3+5+6+9+10+12+15=6945<br /> 6945*(66/2)=229185<br /> il manque les 4 derniers jusqu'à 1000<br /> 229185+993+995+996+999=233168<br /> <br /> <br />
Répondre
P
<br /> <br /> La méthode papier crayon ressemble un peu à la solution 2 (de très loin peut être :))<br /> <br /> <br /> Enfin la méthode à cela de bon qu'elle au moins est juste...et puis la démo a un petit côté "Des chiffres et des lettres", manque plus que le fameux gingle !<br /> <br /> <br /> (Tain, faut que je bouge mes fesses et corrige ma connerie !)<br /> <br /> <br /> Bon en tous cas Laurent, bizarrement, ça m'étonne même pas que tu aimes les jeux de maths (jeux de vilains ?) !<br /> <br /> <br /> Ah puis tiens au passage, il te manque le 1000 (on va dire que sans mention spécifique, une borne est considérée comme fermée ?)<br /> <br /> <br /> <br />
L
<br /> j'ai fait joujou il y a quelque temps :<br /> http://projecteuler.net/profile/laurentschneider.png<br /> <br /> Bon, je ne posterais pas les solutions sur ton blog, en effet il y a trop de toccards qui utilisent GOOGLE pour trouver les solutions...<br /> <br /> <br />
Répondre
P
<br /> <br /> Bah ces gens là ont besoin de reconnaissance et ils ne savent pas trop comment s'y prendre... je leur conseillerais plutôt de devenir modérateur de forum et partir à la quête des étoiles ;)<br /> <br /> <br /> <br />