সি, 150 140 135 বাইট
r,d;f(k,x){r=x<5?3:f(k+1,x/5);return(d=x%5)?r*"33436"[d]*(1<<d*k%4)%5:r;}main(int c,char**v){c=atoi(*++v);printf("%d",c<2?1:2*f(0,c));}
এটি ASCII সিস্টেমগুলির জন্য সংস্করণ; স্ট্রিং প্রতিস্থাপন 33436
সঙ্গে 11214
একটি EBCDIC সিস্টেমের জন্য, অথবা \1\1\2\1\4
পোর্টেবল প্রোগ্রামের জন্য।
সি সমাধানগুলি একটি সম্পূর্ণ প্রোগ্রাম সরবরাহ করার প্রয়োজনে কিছুটা বাধা সৃষ্টি করে; যাইহোক, এটি পুরোপুরি প্রশ্নের উত্তর দেয়।
এটি অনলাইনে চেষ্টা করুন (জাভাস্ক্রিপ্টের প্রয়োজন):
ব্যাখ্যা
এটি এন এর কমপক্ষে উল্লেখযোগ্য নন-জিরো ডিজিটে বর্ণিত অ্যালগরিদমের উপর ভিত্তি করে ! , ঘুরে দাঁড়ালেন যাতে সর্বোচ্চ পাঁচটি পাওয়ার সন্ধান করতে আমরা পুনরাবৃত্তি করি এবং বেরোনোর পথে গণনা করি। ধ্রুবকের টেবিলগুলি খুব বড় ছিল, তাই আমি পূর্ববর্তী অবশিষ্টাংশ r
, বর্তমান সংখ্যা d
এবং পুনরাবৃত্তির গভীরতার মধ্যে একটি সম্পর্ক খুঁজে পেয়ে এগুলি হ্রাস করেছি k
:
0 1 2 3 4 =d
0 0 3×2^k 1×2^2k 3×2^3k 2
1 1 1×2^k 2×2^2k 1×2^3k 4
r 2 2 2×2^k 4×2^2k 2×2^3k 3
3 3 3×2^k 3×2^2k 3×2^3k 2
4 4 4×2^k 4×2^2k 4×2^3k 1
কারণ r>0
, এটি একটি ধ্রুবক বার r
বার 2^dk
( সংশোধন 5) সমাধান করে; ধ্রুবকগুলি a[]
নীচে রয়েছে (গল্ফযুক্ত কোডটিতে অন্তর্ভুক্ত)। আমরা এটিও (2^4)%5
1 টি পর্যবেক্ষণ করি , তাই এর পরিসীমাটিকে অতিরিক্ত প্রবাহ এড়াতে আমরা ঘাতককে হ্রাস করতে পারি int
।
const int a[] = { 1, 1, 2, 1, 4 };
int f(int k, int x){
int r = x<5 ? 3 : f(k+1,x/5); /* residue - from recursing to higher-order quinary digits */
int d = x%5;
if (!d)
return r;
return r * a[d] * (1<<d*k%4) % 5;
}
int main(int c, char **v)
{
c = atoi(*++v);
printf("%d",
c<2
? 1 /* special-case 0 & 1 */
: 2*f(0,c)); /* otherwise, it's 2 times r */
}
পরীক্ষা:
$ for i in 100 1000 10000 100000; do echo $i: `./694 $i`; done
100: 4
1000: 2
10000: 8
100000: 6
1000000: 4
পারফরম্যান্সটিও সম্মানজনক। এখানে 32-বিট সহ একটি সিস্টেমের সর্বাধিক ইনপুট রয়েছে int
:
$ time ./694 2147483647
8
real 0m0.001s
user 0m0.000s
sys 0m0.000s
আমিও সর্বোচ্চ 64৪-বিট সহ একই সময় পেয়েছি int
।