C, C ++, 46 40 37 ไบต์ (#define), 50 47 46 ไบต์ (ฟังก์ชั่น)
-1 ไบต์ขอบคุณZacharý
-11 ไบต์ขอบคุณไปที่แมวป่า
เวอร์ชันมาโคร:
#define F(n)n*n*~n*~n/4+n*~n*(n-~n)/6
รุ่นฟังก์ชั่น:
int f(int n){return~n*n*n*~n/4+n*~n*(n-~n)/6;}
เส้นที่อยู่บนพื้นฐานของสูตร 2 รายการ:
ผลรวมของตัวเลขระหว่าง 1 ถึง n = n*(n+1)/2
ผลรวมของกำลังสองระหว่าง 1 ถึง n =n*(n+1)*(2n+1)/6
สูตรที่จะได้คำตอบก็คือ (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)/2*n*(n+1)/2 - n*(n+1)*(2n+1)/6
=>
n*(n+1)*n*(n+1)/4 - n*(n+1)*(2n+1)/6
สังเกตรูปแบบp = n*n+1 = n*n+n
ดังนั้นในฟังก์ชั่นเราประกาศตัวแปรอื่นint p = n*n+n
และให้:
p*p/4 - p*(2n+1)/6
สำหรับp*(p/4-(2*n+1)/6)
และอื่น ๆn*(n+1)*(n*(n+1)/4 - (2n+1)/6)
ก็ทำงานครึ่งเวลาเท่านั้นและผมแบ่งจำนวนเต็มผู้ต้องสงสัยที่จะเป็นสาเหตุ ( f(3)
ให้ 24 แทน 22 f(24)
ให้ 85,200 แทน 85100 ดังนั้นเราจึงไม่สามารถ Factorize สูตรแมโครของวิธีการที่แม้ว่าทางคณิตศาสตร์มันเป็น เหมือน.
ทั้งรุ่นแมโครและฟังก์ชันอยู่ที่นี่เนื่องจากการทดแทนแมโคร:
F (3) ให้3*3*(3+1)*(3+1)/4-3*(3+1)*(2*3+1)/6 = 22
F (5-2) ให้5-2*5-2*(5-2+1)*(5-2+1)/4-5-2*(5-2+1)*(2*5-2+1)/6 = -30
และสับสนกับลำดับความสำคัญของผู้ประกอบการ รุ่นฟังก์ชั่นไม่มีปัญหานี้