C, C ++, 46 40 37 Bytes (#define), 50 47 46 Bytes (function)
-1 Byte dank Zacharý
-11 bytes dank ceilingcat
Makroversion:
#define F(n)n*n*~n*~n/4+n*~n*(n-~n)/6
Funktionsversion:
int f(int n){return~n*n*n*~n/4+n*~n*(n-~n)/6;}
Diese Zeilen basieren auf diesen 2 Formeln:
Summe der Zahlen zwischen 1 und n = n*(n+1)/2
Summe der Quadrate zwischen 1 und n =n*(n+1)*(2n+1)/6
Die Formel für die Antwort lautet also einfach (n*(n+1)/2) * (n*(n+1)/2) - n*(n+1)*(2n+1)/6
Und jetzt, um die Byteanzahl zu "optimieren", brechen wir die Klammern und verschieben die Daten, während das Testen immer das gleiche Ergebnis liefert
(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
Beachten Sie das Muster p = n*n+1 = n*n+n, also deklarieren wir in der Funktion eine andere Variable int p = n*n+nund es gibt:
p*p/4 - p*(2n+1)/6
Für p*(p/4-(2*n+1)/6)und so n*(n+1)*(n*(n+1)/4 - (2n+1)/6)funktioniert es nur die Hälfte der Zeit, und ich vermute, dass die Ganzzahldivision die Ursache ist ( f(3)24 statt 22, f(24)85200 statt 85100, also können wir die Formel des Makros nicht so faktorisieren, auch wenn es mathematisch so ist das Gleiche.
Sowohl die Makro- als auch die Funktionsversion sind hier aufgrund der Makrosubstitution:
F (3) ergibt 3*3*(3+1)*(3+1)/4-3*(3+1)*(2*3+1)/6 = 22
F (5-2) ergibt5-2*5-2*(5-2+1)*(5-2+1)/4-5-2*(5-2+1)*(2*5-2+1)/6 = -30
und versauen mit dem Operator Vorrang. Die Funktionsversion hat dieses Problem nicht