C, C ++, 46 40 37 byte (#define), 50 47 46 byte (chức năng)
-1 byte nhờ Zacharý
-11 byte nhờ trần
Phiên bản macro:
#define F(n)n*n*~n*~n/4+n*~n*(n-~n)/6
Phiên bản chức năng:
int f(int n){return~n*n*n*~n/4+n*~n*(n-~n)/6;}
Các dòng của Thoses dựa trên 2 công thức:
Tổng các số từ 1 đến n = n*(n+1)/2
Tổng bình phương từ 1 đến n =n*(n+1)*(2n+1)/6
Vì vậy, công thức để có được câu trả lời chỉ đơn giản là (n*(n+1)/2) * (n*(n+1)/2) - n*(n+1)*(2n+1)/6
Và bây giờ để "tối ưu hóa" số byte, chúng tôi phá vỡ dấu ngoặc đơn và di chuyển các thứ xung quanh, trong khi kiểm tra nó luôn cho kết quả tương tự
(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
Lưu ý mẫu p = n*n+1 = n*n+n
, vì vậy trong hàm, chúng ta khai báo một biến khác int p = n*n+n
và nó đưa ra:
p*p/4 - p*(2n+1)/6
Vì p*(p/4-(2*n+1)/6)
vậy n*(n+1)*(n*(n+1)/4 - (2n+1)/6)
, nó chỉ hoạt động được một nửa thời gian và tôi nghi ngờ sự phân chia số nguyên là nguyên nhân ( f(3)
đưa ra 24 thay vì 22, f(24)
cho 85200 thay vì 85100, vì vậy chúng ta không thể xác định công thức của macro theo cách đó, ngay cả khi về mặt toán học giống nhau.
Cả phiên bản macro và chức năng đều ở đây vì thay thế macro:
F (3) cho 3*3*(3+1)*(3+1)/4-3*(3+1)*(2*3+1)/6 = 22
F (5-2) cho5-2*5-2*(5-2+1)*(5-2+1)/4-5-2*(5-2+1)*(2*5-2+1)/6 = -30
và gây rối với các nhà điều hành ưu tiên. phiên bản chức năng không có vấn đề này