我寫在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;
}
+1。雖然這不是OP當前問題的根源,但是他在修復前一個時就會面對這個問題:) – us2012 2013-02-10 05:18:50
100000 * 8 =〜800KB,並且這個數量的兩倍(在main函數中也是),大約是1.6MB。它將在Windows上成爲問題,但絕對不適用於* NIX。儘管如此,你的建議仍然有效。 – nhahtdh 2013-02-10 05:21:42
+1此外,main()的arr [n]數組大約是6.4 MB。當你添加遞歸時,很容易耗盡堆棧空間。 – 2013-02-10 05:22:56