这是一个C程序,用于计算从0到n:nCk的k之和。我遇到了一个分割错误 变量测试是随后的测试用例数 函数factorial返回数字的阶乘 函数sum给出了从1到n nCk的k之和

这是一个C程序,用于计算从0到n:nCk的k之和。我遇到了一个分割错误 变量测试是随后的测试用例数 函数factorial返回数字的阶乘 函数sum给出了从1到n nCk的k之和,c,arrays,algorithm,math,segmentation-fault,C,Arrays,Algorithm,Math,Segmentation Fault,这是我的密码: #include<stdio.h> float factorial(int x) { if(x==1) return 1.0; else return (x*factorial(x-1)); } int summ(int y) { int k=1;double sum=0;int r; while(k<=y) { sum=sum +((factorial(y))/(factorial(y-k

这是我的密码:

#include<stdio.h>
float factorial(int x)
{
    if(x==1)
    return 1.0;
    else
    return (x*factorial(x-1));
}
int summ(int y)
{
    int k=1;double sum=0;int r;
    while(k<=y)
    {
        sum=sum +((factorial(y))/(factorial(y-k)*factorial(k)));
        k++;
    }
    r=(int)sum%(int)((1000000007.00));
    return r;
}
main()
{
    int test;
    scanf("%d",&test);int j=0;
    int i=0;int arr[test];int val;int flag;
    while(i<test)
    {
        scanf("%d",&val);
        flag=summ(val);
        arr[i]=flag;
    i++;
    }
    while(j<test)
    {
        printf("%d\n",arr[j] );
        j++;
    }
    return 0;
}
#包括
浮点阶乘(整数x)
{
如果(x==1)
返回1.0;
其他的
收益率(x*阶乘(x-1));
}
整数总和(整数y)
{
整数k=1;双和=0;整数r;
而在阶乘函数中(k
做
如果(n==1 | | n==0)
返回1;
…在阶乘函数中
做
如果(n==1 | | n==0)
返回1;
…作为提示,请查看

(n选择0)+(n选择1)+……+(n选择n)=2n

这可以在一行代码中使用位移位进行计算

希望这有帮助!

作为提示,请查看

(n选择0)+(n选择1)+……+(n选择n)=2n

这可以在一行代码中使用位移位进行计算

希望这有帮助!

(nC1+nC2+nC3…nCn)=2^n-1使用二项式理论

2^n可以使用快速幂运算在O(logn)中计算

(nC1+nC2+nC3…nCn)=2^n-1使用二项式理论

2^n可以使用快速幂运算在O(logn)中计算


要修复程序,请注意,当
x=0
时,您的函数
factorial
将崩溃,因为递归从0到-1、到-2、到-3等等。检查
summ
函数,然后您可以发现当
k=y
时,调用了
factorial(0)


然而,为了有效地解决您的问题,而不仅仅是修复您的程序,您应该参考templatetypedef的想法。

要修复您的程序,请注意,当
x=0
时,您的函数
阶乘
将崩溃,因为递归从0到-1、到-2、到-3,等等。请检查
summa
函数,然后en您可以发现,当调用
k=y
时,
factorial(0)


但是,为了有效地解决问题,而不仅仅是修复程序,您应该参考templatetypedef的想法。

当x=0时,阶乘函数会发生什么?还有,y和k的范围是什么?递归阶乘()的例程将创建与传递给它的值一样多的堆栈帧——除了小值之外,任何值都会崩溃。此外,在计算nCk+和后应用模函数。您肯定会超过整数范围。此外,在这种情况下,您应该使用无符号长整型而不是整型。阶乘乐趣中会发生什么当x=0时的作用?还有,y和k的范围是多少?递归阶乘()例程将创建与传递给它的值一样多的堆栈帧——除了小值之外,任何值都会崩溃。此外,在计算nCk+sum后应用模函数。您肯定会超过整数范围。此外,在这种情况下,您应该使用无符号long int而不是int。