सी, 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 प्रणालियों के लिए संस्करण है; EBCDIC सिस्टम के लिए, या एक पोर्टेबल प्रोग्राम के 33436
साथ स्ट्रिंग को बदलें ।11214
\1\1\2\1\4
सी समाधान एक पूर्ण कार्यक्रम प्रदान करने की आवश्यकता से थोड़ा बाधित होता है; हालाँकि, यह पूरी तरह से सवाल का जवाब देता है।
इसे ऑनलाइन आज़माएं (जावास्क्रिप्ट की आवश्यकता है):
व्याख्या
यह n के कम से कम महत्वपूर्ण शून्य शून्य में उल्लिखित एल्गोरिथ्म पर आधारित है ! , चारों ओर मोड़ दिया ताकि हम पांच की उच्चतम शक्ति को खोजने के लिए पुनरावृत्ति करें, और बाहर निकलने के तरीके पर गणना करें। स्थिरांक की तालिकाएं बहुत बड़ी थीं, इसलिए मैंने उन्हें पिछले अवशेषों 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
(mod 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
।