c程序不接受高达100000的输入
我用c写了一个程序,它应该从1到100000获取输入,但是当我运行这个程序时,我只获取12773的输入,但是我使用长-长无符号int作为数组的输入 如果输入少于12774,程序将显示正确的行为,但不会超过该输入。 我制作的程序是 我不理解c的这种奇怪行为c程序不接受高达100000的输入,c,C,我用c写了一个程序,它应该从1到100000获取输入,但是当我运行这个程序时,我只获取12773的输入,但是我使用长-长无符号int作为数组的输入 如果输入少于12774,程序将显示正确的行为,但不会超过该输入。 我制作的程序是 我不理解c的这种奇怪行为 #include<stdio.h> #include<stdlib.h> unsigned long long int inversion_count(unsigned long long int *arr, uns
#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;
}
#包括
#包括
无符号长整型反转计数(无符号长整型*arr,无符号长整型开始,无符号长整型结束)
{
无符号long long int left_count,right_count,split_count=0,i,left_arend,j,no_ele;
no_ele=结束-开始;
无符号long long int temp_arr[no_ele],k=0;
if(no_ele==1)//这意味着只传递一个元素
返回0;
其他的
{
左箭头=开始+(无ele/2);
左计数=反转计数(arr、start、left arrend);
右计数=反转计数(arr、左计数、end);
i=开始;
j=左侧;
而((i 如果(arr[i]这是ideone.com的问题,而不是C。ideone.com对输入文本框有一个限制(最大大小),您的输入超过了这些限制
要么在本地计算机上安装一个编译器并在那里执行您的工作,要么重写您的程序:因为您的输入只是连续的整数,您可以在程序中生成它们,而不是从输入中读取它们。我想您的问题可能是堆栈空间不足。在inversion\u count()中
功能,您有一个VLA:
unsigned long long int temp_arr[no_ele], k=0;
我怀疑你在忙于递归时占用了太多的空间。我不确定使用递归来计算数组中的反转数是否有任何好处;我希望使用一个线性过程。事实上,如果你只需要计算inv,就不清楚你需要在内存中保留多于最后一行和当前一行的内容版本。+1.虽然这不是OP当前问题的根源,但只要他修复了前一个问题,他就会面临这个问题:)100000*8=~800KB,是这个数量的两倍(在主函数中也是如此),即~1.6MB。这在Windows上是个问题,但绝对不是*NIX的问题。尽管如此,您的建议仍然有效。+1,main()'s arr[n]数组大约为6.4 MB。当你加入递归时,很容易耗尽堆栈空间。但在任何编程竞赛中,你都可以使用多达256MB的空间,我想我还没有达到这个范围。我创建了一个数据集,并在Mac上运行它;它“工作”正常,不过得到了答案2502463994个反转,这要么是非常错误的或者表示您正在计算的反转与我期望的不同。坦白说,我不理解反转\u count()
函数。通过检查scanf()
的结果来确保您不会过早获得EOF也是一个好主意。