C, C ++, 46 40 37 byte (#define), 50 47 46 byte (funzione)
-1 byte grazie a Zacharý
-11 byte grazie a ceilingcat
Versione macro:
#define F(n)n*n*~n*~n/4+n*~n*(n-~n)/6
Versione di funzione:
int f(int n){return~n*n*n*~n/4+n*~n*(n-~n)/6;}
Queste linee si basano su queste 2 formule:
Somma di numeri tra 1 e n = n*(n+1)/2
Somma di quadrati tra 1 e n =n*(n+1)*(2n+1)/6
Quindi la formula per ottenere la risposta è semplicemente (n*(n+1)/2) * (n*(n+1)/2) - n*(n+1)*(2n+1)/6
E ora per "ottimizzare" il conteggio dei byte, interrompiamo le parentesi e spostiamo le cose, mentre testarle dà sempre lo stesso risultato
(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
Nota il modello p = n*n+1 = n*n+n, quindi nella funzione dichiariamo un'altra variabile int p = n*n+ne dà:
p*p/4 - p*(2n+1)/6
Per p*(p/4-(2*n+1)/6)così n*(n+1)*(n*(n+1)/4 - (2n+1)/6), funziona solo la metà del tempo, e sospetto che la divisione intera sia la causa ( f(3)dando 24 invece di 22, f(24)dando 85200 anziché 85100, quindi non possiamo fattorizzare la formula della macro in quel modo, anche se matematicamente lo è lo stesso.
Sia la versione macro che la funzione sono qui a causa della sostituzione della macro:
F (3) dà 3*3*(3+1)*(3+1)/4-3*(3+1)*(2*3+1)/6 = 22
F (5-2) dà5-2*5-2*(5-2+1)*(5-2+1)/4-5-2*(5-2+1)*(2*5-2+1)/6 = -30
e sbagliare con la precedenza dell'operatore. la versione della funzione non presenta questo problema