সি, সি ++, 46 40 37 বাইট (# নির্দিষ্ট), 50 47 46 বাইট (ফাংশন)
-1 বাইট জ্যাকারিকে ধন্যবাদ ý
-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 এর মধ্যে সংখ্যার যোগফল 1 এবং n = 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)/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)
22 এর পরিবর্তে 24 দান, f(24)
85100 পরিবর্তে 85200 দান, তাই আমরা করতে পারেন গুণক নির্ণয় করা ম্যাক্রো এর সূত্র না যে ভাবে, এমনকি যদি গাণিতিকভাবে এটা একই.
ম্যাক্রো এবং ফাংশন সংস্করণ উভয়ই ম্যাক্রো প্রতিস্থাপনের কারণে এখানে রয়েছে:
F (3) 3*3*(3+1)*(3+1)/4-3*(3+1)*(2*3+1)/6 = 22
এফ দেয় (5-2) দেয়5-2*5-2*(5-2+1)*(5-2+1)/4-5-2*(5-2+1)*(2*5-2+1)/6 = -30
এবং অপারেটর প্রাধান্য সঙ্গে জগাখিচুড়ি। ফাংশন সংস্করণে এই সমস্যা নেই