Overblog
Suivre ce blog
Editer l'article 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

Published by Pacman - dans SQL cosmétique
commenter cet article

commentaires

Laurent Schneider 24/05/2011 08:05


Ah oui, j'avais oublié que 1000 se divisait par 5 :)

La méthode 2 est cool!


Pacman 25/05/2011 07:01



C'est clair que ça fait toujours plaisir de trouver une solution purement calculatoire (et non algorithmique)...


(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)



Laurent Schneider 20/05/2011 08:54


La méthode papier crayon :
Entre 1 et 15 on a 3,5,6,9,10,12,15 = 15 chiffres
1000 div 15 = 66
66*15 = 990
en prennant les 6 premiers et 6 derniers de la série on a
990+987+985+984+981+980+978+3+5+6+9+10+12+15=6945
6945*(66/2)=229185
il manque les 4 derniers jusqu'à 1000
229185+993+995+996+999=233168


Pacman 23/05/2011 23:55



La méthode papier crayon ressemble un peu à la solution 2 (de très loin peut être :))


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 !


(Tain, faut que je bouge mes fesses et corrige ma connerie !)


Bon en tous cas Laurent, bizarrement, ça m'étonne même pas que tu aimes les jeux de maths (jeux de vilains ?) !


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 ?)



Laurent Schneider 20/05/2011 08:43


j'ai fait joujou il y a quelque temps :
http://projecteuler.net/profile/laurentschneider.png

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...


Pacman 25/05/2011 07:00



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