求组合很简单:
#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;
}