C语言求组合数

                                        ***组合数***(C语言)

题目:求组合数C(N,M),以及C(N,M)因子个数。

要求:

输入格式
N和M,其中0<=M<=N<=50,以EOF结束。

输出格式
该组合数结果

怎么说,这个题目看起来不难,可是我却交了无数次,一直时间超限
哎 ,叹口老气。

看看我的代码,能过能过
#include<stdio.h>
int a[60]={0};//全局变量,放质因子
//定义函数求质因子和因子
long long int fun(int x,int y)
{
memset(a,0,sizeof(a));
//printf("%d %d\n",a[2],a[7]);
for(int i=x;i>=x-y+1;i–)
{
int t=i;
for(int j=2;j<=t;j++)
{
while(t%j0)
{
a[j]++;
t=t/j;
}
}
}//求出分母的质因子
//printf("%d %d\n",a[2],a[7]);
for(int i=y;i>=2;i–)
{
int t=i;
for(int j=2;j<=t;j++)
{
while(t%j
0)
{
a[j]–;
t=t/j;
}
}
}//减去分子的质因子
//printf("%d %d\n",a[2],a[7]);
//2 7 是组合数的质因子
long long int ans=1;
for(int i=2;i<60;i++)//求组合数
{
if(a[i]!=0)
{
for(int j=1;j<=a[i];j++)
{
ans=ans*i;
}
}
}

return ans;//返回其组合数

}

int main()
{
int x,y;
while(~scanf("%d%d",&x,&y))
{
long long int f=fun(x,y),ans1=1;
for(int i=1;i<60;i++)
{
if(a[i]!=0)
{
ans1=ans1*(a[i]+1);
}
}//计算其因子数
printf("%d %d\n",f,ans1);
}
}

快快,我来解释一下
我是在自定义函数中求得组合数
组合数在求解过程中由两部分组成:分母和分子
如C(8,3)
分子是876
8的质因子有三个2,7的质因子为一个7,6的质因子为一个2一个3,
所以统计分母为四个2,一个3,一个7;
再统计分母123,最后个数相减为一个7,三个2;
就可以求组合数了,2227;
因子个数 (1+1)
(3+1);

还有一些看起来很厉害的方法,可是不能过
如下:
C(a,b)=C(a-1,b-1)+C(a-1,b);这个可以用递归实现,如果那个题目要使用递归的话。

下面这个是求因子的另一种方法的代码,不是上面的
for(i=1;i*i<=h;i++)
{
if(h%i==0)
{
b[now++]=i;
if(i!=h/i)
b[now++]=h/i;
}
这个now就是因子个数,还是有点六;(我觉得)


  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值