2011-09-18 11 views
6

अशुभ नंबर (नहीं होमवर्क)अशुभ नंबर

कुछ संख्या अशुभ माना जाता (यह केवल 4 और 7 होता है) कर रहे हैं। हमारा लक्ष्य सकारात्मक पूर्णांक ए और बी की सीमा में ऐसी संख्याओं की गिनती को ढूंढना है।
उदाहरण के लिए:
इनपुट: एक = 10 ख = 20
आउटपुट: 0
इनपुट: एक = 30 ख = 50
आउटपुट: 2 (44, 47)

नीचे कोड मैंने कोशिश की है एक स्थिर सरणी दृष्टिकोण का उपयोग करके बाहर, जिसमें मैं शुरुआत में 32-बिट पूर्णांक के लिए सभी संभावित दुर्भाग्यपूर्ण संख्याओं की गणना करता हूं। यह ओ (एन) में किया जाता है और बाद में एक अनुक्रमिक स्कैन गिनती प्राप्त करने में मदद करता है जो एक ओ (एन) ऑपरेशन है। क्या स्थैतिक सरणी की सहायता के बिना इसे हल करने के लिए कोई बेहतर तरीका है?

#define MAX_UNLUCKY 1022 
static int unlucky[MAX_UNLUCKY]; 
int main(int argc, char **argv) { 
    int i, j, k; 
    int a, b, factor; 
    printf("Enter the numbers : \n"); 
    scanf("%d",&a); 
    scanf("%d",&b); 
    unlucky[0] = 4; 
    unlucky[1] = 7; 
    factor = 10; 
    k = 1; 
    for(i = 2; i < MAX_UNLUCKY; ++i) 
     unlucky[i] = unlucky[(i >> 1) - 1]*factor + unlucky[k ^= 1]; 
    for (i = 0; i < MAX_UNLUCKY;++i) 
     if (unlucky[i] > a) break; 
    for (k = i; k < MAX_UNLUCKY;++k) { 
     if (unlucky[k] > b) break; 
     printf("Unlukcy numbers = %d\n", unlucky[k]); 
    } 
    printf ("Total Number of Unlucky numbers in this range is %d\n", k-i); 
    return (0); 
} 
+1

माइनर अनुकूलन टिप्पणी है: अपने दृष्टिकोण 'कश्मीर = 1;' [.. ।] '+ दुर्भाग्यपूर्ण [k^= 1]; 'अनुक्रम उत्पन्न करने के लिए' 4,7,4,7,4 ...' एक सरणी लुकअप का उपयोग कर रहा है जिसे आप 'k = 7;' जैसे कुछ का उपयोग करके हटा सकते हैं। [ ...] '+ (के = 11 - के)'। – schnaader

+2

यह होमवर्क है? –

+0

मुझे यकीन है कि यह 'लॉग (एन)^के' समय और स्थान (छोटे स्थिर के साथ) में संभव है, लेकिन मैं वास्तविक के गणना करने के लिए बहुत आलसी हूं)। आपको केवल गिनती की गणना करने की आवश्यकता है, आपको उन सभी को गिनने की आवश्यकता नहीं है। आप इसका उपयोग कर सकते हैं कि संख्या 10^एन के नीचे 2^एन दुर्भाग्यपूर्ण संख्याएं हैं। – CodesInChaos

उत्तर

3

निम्नलिखित पर विचार करें:

वहाँ कितने नंबर दिए गए हैं है कि कि उनकी संख्या कितनी अशुभ संख्या वहाँ 744 और 777 (744,747,774,777) के बीच हैं

के बीच
0x100 and 0x111? 

100,101,110,111 (4 = 0x111 - 0x100 + 1) 

अब:

700 और 800 744 के रूप में उन दोनों के बीच अशुभ नंबर की एक ही नंबर और 777 744 है 700 और 777 की तुलना में छोटी से छोटी अशुभ संख्या अधिक है 800

से सबसे बड़ी अशुभ संख्या छोटी है

संख्याएं उत्पन्न करने की कोई आवश्यकता नहीं, केवल घटाव।

एक = 10, ख = 800 तरह के मामलों के लिए, पहली 10-100 के लिए अपने नंबर मिल और फिर 100-800 (क्योंकि आप कुछ संख्या की गिनती हो जाएगा दो बार):

10-100 के लिए:

a = 44 
b = 77 

0x11 - 0x00 = 3 + 1 = 4 (44,47,74,77) 

100-800 के लिए:

a = 444 
b = 777 

0x111 - 0x000 = 7 + 1 = 8 (444, 447, 474, 477, 744, 747, 774, 777) 

तो बीच 10 और 800: 4 + 8 = 12 नंबर है, जो भी सही है।

यह भी हे (1) समय & अंतरिक्ष आप सहायक संख्या कुशलता से पाते हैं, जो बहुत कठिन नहीं होना चाहिए ...

+0

कहें यदि आप इसे अंक से विभाजित कर रहे हैं, तो आपको ओ (1), चूंकि आप Θ (लॉग (एन)) कंप्यूटेशंस कर रहे होंगे।उस ने कहा, मैं इस मुद्दे को हल करने के लिए दो सरल चालों के बारे में सोच सकता हूं। – Nabb

+0

कृपया साझा करें :)। साथ ही, सरलता सीमित संख्या के आकार के लिए मान लें। मेरा मतलब है, अगर आप सभी सैद्धांतिक जाना चाहते हैं, तो ओ (एन) है - क्योंकि आपको अंक से अंक जोड़ना है: पी –

+0

आपको हालांकि, एक बुरा विचार नहीं है ... :) –

संबंधित मुद्दे