2010-01-01 13 views
11

प्रश्न है: 2 मिलियन से नीचे के सभी प्राइम्स का योग खोजें।मैं प्रोजेक्ट यूलर # 10 क्यों विफल कर सकता हूं?

मैंने बहुत अधिक एस्ट्रोथेनेस चीज़ों की चलनी की, और नीचे दिया गया प्रोग्राम छोटी संख्या के लिए काम करता प्रतीत होता है यानी एलआईटी को परिभाषित करता है क्योंकि 10 एल उत्तर के रूप में 17 उत्पादन करता है।

मैंने निम्नलिखित प्रोग्राम द्वारा उत्पादित उत्तर के रूप में 1179908154 सबमिट किया, और यह गलत था।

कृपया समस्या को इंगित करने में सहायता करें। धन्यवाद।

#include <stdio.h> 

#define LIMIT 2000000L 
int i[LIMIT]; 

int main() 
{ 
    unsigned long int n = 0, k, sum = 0L; 
    for(n = 0; n < LIMIT; n++) 
     i[n] = 1; 
    i[0] = 0; 
    i[1] = 0; 

    unsigned long int p = 2L; 

    while (p*p < LIMIT) 
    { 
     k = 2L; 
     while (p*k < LIMIT) 
     { 
      i[p*k] = 0; 
      k++; 
     } 
     p++; 
    } 

    for(n = 0; n < LIMIT; n++) 
     if (i[n] == 1) 
     { 
      sum += n; 
     } 
    printf("%lu\n",sum); 

    return 0; 
} 
+1

% LLU साथ लंबे और% लू के साथ लंबे समय से बदलकर इसे ठीक – idazuwaika

+1

मुझे खुशी है मैं इस सवाल में भाग गया, मैंने इस पर कई निराश दिन बिताए! +1 – DMan

उत्तर

8

आप अभाज्य संख्या सही ढंग से गणना, लेकिन राशि बहुत बड़ी है और (2^32 से अधिक) एक अहस्ताक्षरित 32-बिट लंबे में फिट नहीं होगा। आप इसे ठीक करने के लिए 64-बिट संख्या (long long कुछ कंपाइलर्स) का उपयोग कर सकते हैं।

+0

धन्यवाद। या मैं बस मानता हूं कि किसी भी उद्देश्य के लिए लंबे समय से हस्ताक्षरित पहले से ही बहुत बड़ा था। मूर्ख मुझे – idazuwaika

+0

आप समय-समय पर इसमें भाग लेंगे; बड़ी संख्या में कई यूलर समस्याएं हैं। कभी-कभी आप 'लंबे समय तक' या असीमित प्रकारों का उपयोग करने से बचने के लिए चतुर चालबाजी कर सकते हैं; कभी-कभी आप नहीं कर सकते। – Thomas

1

आपका तर्क सही हो रहा है, लेकिन आप डेटा प्रकार और उनके ranges.Check कि क्या यह काम करता है या नहीं के साथ खिलवाड़ कर रहे हैं:

#include <stdio.h> 

#define LIMIT 2000000 
int i[LIMIT]; 

int main() 
{ 
    long long int n = 0, k, sum = 0; 
    for(n = 0; n < LIMIT; n++) 
    i[n] = 1; 
    i[0] = 0; 
    i[1] = 0; 

    long long int p = 2; 

    while (p*p < LIMIT) 
    { 
    k = 2; 
    while (p*k <LIMIT) 
    { 
     i[p*k] = 0; 
     k++; 
    } 
    p++; 
    } 

    for(n = 0; n < LIMIT; n++) 
    if (i[n] == 1) 
    { 
     sum += n; 
    } 
    printf("%lld\n",sum); 

    return 0; 
} 

Output :142913828922

0

आप यह भी हो सकता है कि आप की आवश्यकता कंपाइलर स्विच -std = c99 का उपयोग करने के लिए। मैंने जीसीसी (जीसीसी) 3.4.5 (मिंगव-विस्टा विशेष आर 3) के साथ किया था।

यानी

जीसीसी -Wall -std = c99 -ओ problem10 problem10.c

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