c程序不接受高达100000的输入

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

我用c写了一个程序,它应该从1到100000获取输入,但是当我运行这个程序时,我只获取12773的输入,但是我使用长-长无符号int作为数组的输入

如果输入少于12774,程序将显示正确的行为,但不会超过该输入。 我制作的程序是 我不理解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;
}
#包括
#包括
无符号长整型反转计数(无符号长整型*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也是一个好主意。