সি, 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)%51 টি পর্যবেক্ষণ করি , তাই এর পরিসীমাটিকে অতিরিক্ত প্রবাহ এড়াতে আমরা ঘাতককে হ্রাস করতে পারি 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।