प्रत्येक संभावना है, पहली 20+ मूल्यों और अधिकतम और न्यूनतम मूल्यों के अलावा अन्य जांच की बिना
एक रिकर्सन की गहराई को कम करें हालांकि डॉलर मूल्य उन पहली 12 प्रविष्टियों के लिए गणना मूल्य के समान नहीं है।
सिक्का मूल्यों के लिए < = 49 999, यह देखने के लिए जांचें कि क्या मूल्य पहले ही गणना की गई है, यदि नहीं तो सिक्का को/2/3/4 मानों में तोड़ दें और उन परिणामी मूल्यों में से प्रत्येक को दोबारा शुरू करें।
यह सीमा मान (4 99 99 9) 100000 तक बढ़ाया जा सकता है क्योंकि यह arr [] सरणी का उपलब्ध आकार है।
प्रीसेटिंग और एआर [] सरणी में बचत, निष्पादन समय को कम करने और रिकर्सन की गहराई को कम करने में मदद करने के लिए है।
सरणी का उपयोग किसी भी पहले गणना किए गए मान (पोस्ट कोड में, 4 9 999 तक) को तुरंत max()
फ़ंक्शन द्वारा तुरंत रिकर्सन के बिना वापस किया जा सकता है। मूल्य के
#include <stdio.h>
#include <stdint.h>
#define MAX_ARRAY_LEN (100000)
uint32_t arr[ MAX_ARRAY_LEN ] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
uint32_t max(uint32_t n)
{
if(n < MAX_ARRAY_LEN)
{ // value of 'n' within the range of the learning array arr[]
if(!arr[n] && n)
{ // then learning array arr[] not yet set
return arr[n] = max(n/2) + max(n/3) + max(n/4);
}
else
{ // else learning array arr[] already set for 'this' value of 'n'
return arr[n];
}
}
else
{ // value of 'n' is greater than the learning array arr[]
return max(n/2) + max(n/4) + max(n/3);
}
} // end function: max
int main(void)
{
uint32_t n;
int status;
while((status = scanf("%u", &n)) == 1 && EOF != status)
{
if(1000000000 >= n)
{
printf("%u\n", max(n));
}
else
{
printf(" invalid value entered, must be in the range 0...1 000 000 000\n");
} // end if
} // end while
return 0;
} // end function: main
रेंज:
मैं इस प्रकार कोड थोड़ा बेहतर प्रलेखन और मजबूती से और तेजी से निष्पादन के लिए संशोधित करेगा। –
@ सौरव घोष 4 9 999 विशेष रूप से क्यों? –
मैं सुझाव दूंगा कि आप 50000 लें और मैन्युअल रूप से कार्य करें जो आपके सरणी में होगा। –