2013-02-10 39 views
0

我寫在C程序這是應該採取輸入從1到100000,但是當我運行程序我只需要輸入高達12773然而,我使用的長長UNSIGNED INT爲列保持輸入。C程序高達100000

如果我給輸入小於12774的程序顯示正確的行爲,但並不比輸入更多。 我做的程序是http://ideone.com/iXM1M0 我不明白c的這種奇怪的行爲。

#include<stdio.h> 
#include<stdlib.h> 


unsigned long long int inversion_count(unsigned long long int *arr, unsigned long long int start, unsigned long long int end) 
{ 
    unsigned long long int left_count, right_count, split_count = 0, i, left_arrend, j, no_ele; 
    no_ele = end - start; 
    unsigned long long int temp_arr[no_ele], k=0; 
    if(no_ele == 1)  // this means that only one element is passed 
     return 0; 
    else 
    { 
     left_arrend = start + (no_ele/2); 
     left_count = inversion_count(arr, start, left_arrend); 
     right_count = inversion_count(arr, left_arrend, end); 
     i = start; 
     j = left_arrend; 
     while((i< left_arrend) && (j < end)) 
     { 
      if(arr[i] <= arr[j]) 
      { 
       temp_arr[k] = arr[i]; 
       i++; 
       k++; 
      } 
      else 
      { 
       split_count += left_arrend - i; 
       temp_arr[k] = arr[j]; 
       j++; 
       k++; 
      } 
     } 
     while(i < left_arrend) 
     { 
      temp_arr[k] = arr[i]; 
      k++; 
      i++; 
     } 
     while(j < end) 
     { 
      temp_arr[k] = arr[j]; 
      j++; 
      k++; 
     } 

     for(i=start; i<end; i++) 
      arr[i] = temp_arr[i-start]; 
     return left_count + right_count + split_count; 
    } 
} 

int main() 
{ 
    unsigned long long int num, n = 100000, i, result; 
    unsigned long long int sum = 0; 
    // scanf("%lld", &n); 
    unsigned long long int arr[n]; 
    for(i=0; i<n; i++) 
    { 
     scanf("%llu", &arr[i]); 
     sum += arr[i]; 
    } 

    result = inversion_count(arr, 0, n); 
    //  for(i=0; i<n; i++) 
    //   printf("%lld\n", arr[i]); 
    printf("%llu\n", result); 
    printf("sum = %llu\n", sum); 
    printf("n = %llu\n", n); 
    return 0; 
} 

回答

0

這是一個ideone.com問題,而不是C. ideone.com先後爲輸入文本框的限制(最大尺寸),並且你會在你輸入這些限制。

在本地計算機上安裝一個編譯器和做你的工作有,或者重寫你的程序:當你的輸入是唯一連續整數,你可以在程序中生成它們,而不是從輸入讀取它們。

2

我認爲你的問題很可能是你正在運行的堆棧空間。在你inversion_count()功能,你有一個VLA:

unsigned long long int temp_arr[no_ele], k=0; 

而且我懷疑你正忙着進行遞歸正在使用太多空間。我不確定使用遞歸計算數組中的反轉次數是否有優勢。我期望使用一個單一的線性通行證。事實上,如果你只需要對倒數進行倒數計算,就不清楚你需要保留比最後一行還是當前記錄更多的內存。

+0

+1。雖然這不是OP當前問題的根源,但是他在修復前一個時就會面對這個問題:) – us2012 2013-02-10 05:18:50

+0

100000 * 8 =〜800KB,並且這個數量的兩倍(在main函數中也是),大約是1.6MB。它將在Windows上成爲問題,但絕對不適用於* NIX。儘管如此,你的建議仍然有效。 – nhahtdh 2013-02-10 05:21:42

+0

+1此外,main()的arr [n]數組大約是6.4 MB。當你添加遞歸時,很容易耗盡堆棧空間。 – 2013-02-10 05:22:56