Partie 1 : initialisation du vecteur
while (n!=0) {
v.push_back(n % 100) ;
n = n / 1000 ;
}
Tant que n est non negatif, on met à la fin de v le résultat de n%100
première itération : n=20000 (!= 0)
v.push_back(20000%100 = 0)
n=20000/1000 = 20
deuxième itération : n=20 (!=0)
v.push_bachk(20%100 = 20)
n=20/1000 = 0 (int !!!)
a la fin : v = <0, 20>
Seconde partie : génération du résultat
La boucle [ for (int i(v.size()-1); i>0; --i) ] démarre de v.size-1 = 1 et itere par pas de -1 tant que i est > 0, donc à priori, ca va tourner un seul tour.
for (++j; v[i]>=j; j=j+2) {
v[i] = v[i] - j ;
}
Cette boucle incrémente j à l'initialisation (donc j=1), puis tant que j est inférieur ou égal à v[i] [i=1 dans cette itération], j est retranché à v[i]
on a donc :
j=1 ( v[i]-=1 ) = 19 (j += 2)=3 // test OK
j=3 ( v[i]-=3 ) = 16 (j += 2)=5 // test OK
j=5 ( v[i]-=5 ) = 11 (j += 2)=7 // test OK
j=7 ( v[i]-=7 ) = 4 (j += 2)=9 // test PAS OK
On sort donc avec j=9
Puis j = 10 * (j-1), 10*8 = 80
Et v[i-1] = v[i-1] + 100*v[i], v[0]=0 est augmenté donc 100*4=400 !
On sort de la boucle sur i, il n'y a bien qu'une itération
Troisième partie : génération du résultat (suite)
for (++j; v[0]>=j; j=j+2) {
v[0] = v[0] - j ;
}
Pareil qu'au dessus, j est incrémenté à 81 à l'initialisation
j=81 ( v[0]-=81 ) = 319 (j += 2)=83
j=83 ( v[0]-=83 ) = 236 (j += 2)=85
j=85 ( v[0]-=85 ) = 151 (j += 2)=87
j=87 ( v[0]-=87 ) = 64 (j += 2)=89
On obtient j=89
Enfin, return (j-1)/2 : (89-1)/2 = 44