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