求组合很简单:
#include<stdio.h>
__int64 zu(int n)
{
__int64 s = 1;
for(int i = 1;i <= n; i++)
s *= i;
return s;
}
int main()
{
int a,b;
scanf("%d%d",&a,&b);
printf("%I64d\n",zu(a)/(zu(a-b)*zu(b)));
return 0;
}在VC6、DEV、CodeBlocks中C语言都可以使用__int64,格式化输出标识为%I64d。__int64是windows专用的,被vc、gcc等编译器支持,在UNIX、Linux中需用long long配合%lld。(标准C的规定。)
#include<stdio.h>
long long zu(int n)
{
long long s = 1;
for(int i = 1;i <= n; i++)
s *= i;
return s;
}
int main()
{
int a,b;
scanf("%d%d",&a,&b);
printf("%lld\n",zu(a)/(zu(a-b)*zu(b))); //即使最终答案在所选择的数据类型范围之中,结果依旧有可能溢出
//输入 21 1 结果为-1
return 0;
}前两个都是答案在所选择的数据类型范围之中,结果依旧有可能溢出正确程序:
#include<stdio.h>
long long zu(int n,int m)
{
if(m < n - m) m = n - m; //小技巧,c(x,y) = c(x,x-y),可以减少s的乘运算
long long s = 1;
for(int i = m+1;i <= n; i++)
s *= i;
for(int i = 1;i <= n-m; i++)
s /= i;
return s;
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
printf("%I64d\n",zu(n,m)); //输入21 1 输出21,正确。
return 0;
}
本文介绍了一种有效的组合数计算方法,避免了直接计算阶乘可能导致的溢出问题。通过简化计算过程并采用适当的技巧,确保了即使在输入值较大时也能得到正确的结果。
168万+

被折叠的 条评论
为什么被折叠?



