这是一个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。