C, C ++, 46 40 37 octets (#define), 50 47 46 octets (fonction)
-1 octet grâce à Zacharý
-11 octets grâce au plafond
Version macro:
#define F(n)n*n*~n*~n/4+n*~n*(n-~n)/6
Version de fonction:
int f(int n){return~n*n*n*~n/4+n*~n*(n-~n)/6;}
Ces lignes sont basées sur ces 2 formules:
Somme des nombres entre 1 et n = n*(n+1)/2
Somme des carrés entre 1 et n =n*(n+1)*(2n+1)/6
Donc, la formule pour obtenir la réponse est simplement (n*(n+1)/2) * (n*(n+1)/2) - n*(n+1)*(2n+1)/6
Et maintenant, pour "optimiser" le nombre d'octets, nous cassons les parenthèses et déplaçons les choses, tout en le testant donne toujours le même résultat
(n*(n+1)/2) * (n*(n+1)/2) - n*(n+1)*(2n+1)/6=>
n*(n+1)/2*n*(n+1)/2 - n*(n+1)*(2n+1)/6=>
n*(n+1)*n*(n+1)/4 - n*(n+1)*(2n+1)/6
Remarquez le modèle p = n*n+1 = n*n+n, donc dans la fonction, nous déclarons une autre variable int p = n*n+net elle donne:
p*p/4 - p*(2n+1)/6
Pour p*(p/4-(2*n+1)/6)et ainsi n*(n+1)*(n*(n+1)/4 - (2n+1)/6), cela fonctionne seulement la moitié du temps, et je soupçonne que la division entière est la cause ( f(3)donnant 24 au lieu de 22, f(24)donnant 85200 au lieu de 85100, donc nous ne pouvons pas factoriser la formule de la macro de cette façon, même si mathématiquement c'est le même.
La version macro et la fonction sont ici en raison de la substitution de macro:
F (3) donne 3*3*(3+1)*(3+1)/4-3*(3+1)*(2*3+1)/6 = 22
F (5-2) donne5-2*5-2*(5-2+1)*(5-2+1)/4-5-2*(5-2+1)*(2*5-2+1)/6 = -30
et gâcher la priorité de l'opérateur. la version de la fonction n'a pas ce problème