2015-11-16 49 views
1

我試圖提交Spoj - Prime Intervals問題的解決方案。但我得到一個運行時錯誤SIGXFSZ。這是由於超過文件大小而發生的。我用Sieve of Eratosthenes算法找到素數。我不明白我的代碼有什麼問題,這是從最近兩天開始的。請幫我提交。這裏是我的代碼...SIGXFSZ運行時錯誤

#include<stdio.h> 
#include<string.h> 
#include<stdbool.h> 
#include<math.h> 

int main(){ 
    int t, turn; 
    long i, l,u,k,j; 
    scanf("%d", &t); 

    /*Looping for t test cases*/ 
    for(turn=0; turn<t; turn++){ 
     scanf("%ld %ld", &l, &u); 
     bool arr[u-l+1]; 

     /*Assigning whole array with true*/ 
     memset(arr, true, u-l+1); 

     /*Sieve of Eratosthenes logic for assigning false to composite values*/ 
     for(i=0; i<=(int)sqrt(u)-l; i++){ 
      k=0; 
      j = i+l; 
      if(arr[i]==true){ 
       while((j*j + k*j) <= u){ 
        arr[(j*j + k*j) - l] = false; 
        k++; 
       } 
      } 
     } 

     /*Printing all the primes in the interval*/ 
     for(i=0; i<u-l; i++){ 
      if(arr[i]==true){ 
       printf("%ld\n", i+l); 
      } 
     } 
    } 

return 0; 
} 

測試輸入:

2 
2 10 
2 100 

輸出:

2 
3 
5 
7 
2 
3 
5 
7 
11 
13 
17 
19 
23 
29 
31 
37 
41 
43 
47 
53 
59 
61 
67 
71 
73 
79 
83 
89 
97 
+0

什麼樣的價值觀,你的投入,得到運行時錯誤? – fghj

+0

@ user1034749輸入不是由我給出的。這是來自spoj的問題,答案沒有被網上法官接受。 – Prashanth

+0

如果你輸入'1'作爲第一個數字,那你爲什麼需要'2 100'?程序只處理'2 10'。 – fghj

回答

0

我跑的發佈代碼。結果遠不正確。

大多數的數字輸出的不是素數並且不能檢查的最後編號爲的範圍內,如圖中第二組結果

這裏是結果:

1  <-- 1 test case 
20 100 <-- range 20...100 
20  <-- the outputs 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
34 
35 
36 
37 
38 
39 
40 
41 
42 
43 
44 
45 
46 
47 
48 
49 
50 
51 
52 
53 
54 
55 
56 
57 
58 
59 
60 
61 
62 
63 
64 
65 
66 
67 
68 
69 
70 
71 
72 
73 
74 
75 
76 
77 
78 
79 
80 
81 
82 
83 
84 
85 
86 
87 
88 
89 
90 
91 
92 
93 
94 
95 
96 
97 
98 
99 

注意:在使用1作爲該範圍的低端通常與沒有產生

這裏的輸出結果是另一個運行

輸出應該是5 7 11

1  <-- test cases 
5 11 <-- range 
5  <-- outputs 
6 
7 
8 
9 
10 
0

下面的代碼不會嘗試最小化ARR []陣列的尺寸,並且如果該範圍的上端是小於16K然後可以宣佈該ARR []作爲short而非unsigned int

輸入低端的最低有效值爲2,但代碼沒有檢查該低端限制,您可能需要添加該檢查。

代碼不會盡量減少通過檢查上限的平方根來執行的循環次數,您可能需要添加該檢查。

代碼乾淨地編譯,處理上限爲素數時,下限爲素數時以及極限值不是素數時的情況。

#include <stdio.h> 
#include <string.h> 
#include <math.h> 

int main() 
{ 
    int numTestCases, testCase; 
    size_t i; // index 
    size_t lowLimit; 
    size_t upperLimit; 
    size_t k; // offset multiplier 


    scanf("%d", &numTestCases); 

    /*Looping for t test cases*/ 
    for(testCase=0; testCase<numTestCases; testCase++) 
    { 
     scanf("%lu %lu", (unsigned long*)&lowLimit, (unsigned long*)&upperLimit); 
     unsigned arr[upperLimit+1]; 

     /*Assigning whole array to indicate entry is a prime*/ 
     memset(arr, 0x01, upperLimit+1); 

     /*Sieve of Eratosthenes logic for assigning false to composite values*/ 
     //size_t sqrtUpperLimit = (size_t)ceil(sqrt(upperLimit)); 
     for(i=2; i<= upperLimit; i++) 
     { 

      if(arr[i]) 
      { 
       if(i >= lowLimit) 
       { 
        printf("%ld\n", i); 
       } 

       for(k=2; (i*k) <= upperLimit; k++) 
       { 
        arr[(i*k)] = 0; 
       } 
      } 
     } 
    } 

    return 0; 
} // end function; main 

這裏是代碼的編輯版本,與提示經由呼叫的用戶的方式加入一些儀表printf()

#include <stdio.h> 
#include <string.h> 
#include <math.h> 

int main() 
{ 
    int numTestCases, testCase; 
    size_t i; // index 
    size_t lowLimit; 
    size_t upperLimit; 
    size_t k; // offset multiplier 

    printf("enter number of test cases\n"); 
    scanf("%d", &numTestCases); 

    /*Looping for t test cases*/ 
    for(testCase=0; testCase<numTestCases; testCase++) 
    { 
     printf("enter lower limit upper limit limits\n"); 

     scanf("%lu %lu", (unsigned long*)&lowLimit, (unsigned long*)&upperLimit); 
     unsigned arr[upperLimit+1]; 

     /*Assigning whole array to indicate entry is a prime*/ 
     memset(arr, 0x01, upperLimit+1); 

     /*Sieve of Eratosthenes logic for assigning false to composite values*/ 
     //size_t sqrtUpperLimit = (size_t)ceil(sqrt(upperLimit)); 
     for(i=2; i<= upperLimit; i++) 
     { 

      if(arr[i]) 
      { 
       if(i >= lowLimit) 
       { 
        printf("%ld\n", i); 
       } 

       for(k=2; (i*k) <= upperLimit; k++) 
       { 
        arr[(i*k)] = 0; 
       } 
      } 
     } 
    } 

    return 0; 
} // end function; main 

使用上述儀器代碼和的輸入:

5 2 3 30 31 20 27 2 3 4 5 

它工作完美。

這是輸出:

enter number of test cases 
5 
enter upper/lower limits 
2 3 
sizeof arr[]: 4 
2 
3 
enter upper/lower limits 
30 31 
sizeof arr[]: 32 
31 
enter upper/lower limits 
20 27 
sizeof arr[]: 28 
23 
enter upper/lower limits 
2 3 
sizeof arr[]: 4 
2 
3 
enter upper/lower limits 
4 5 
sizeof arr[]: 6 
5 
+0

感謝您指出錯誤。我已經修復了其中的大部分。而你的程序不適用於以下輸入:'5 2 3 30 31 20 27 2 3 4 5'。它沒有爲'20 27'產生任何輸出。但奇怪的是它適用於'1 20 27'。 – Prashanth

+0

我剛剛跑了1 2 3,它正常工作,輸出2 3,我只跑了1 30 31,它工作正常,輸出31.我只跑了1 20 27,它工作正常,輸出23。我只跑了1 4 5 5並正常工作,輸出5. – user3629249

+0

是的,它的工作..但我在談論上述輸入'5'測試案例,其中一個輸入是'20 27' – Prashanth