Newguy


私信TA

用户名:772007765

访问量:88334

签 名:

已秃人士

等  级
排  名 29
经  验 15290
参赛次数 3
文章发表 92
年  龄 0
在职情况 在职
学  校
专  业

  自我简介:

#include <stdio.h>
#include <math.h>
long C(int ,int );                   //为C(n+m-1)(m)计算排列数,其中n为当前位置的数值,m为当前位置
void main()
{
	long sum=0,max;              //sum用于计算符合的总数,max为X进制
	int k,w,weis,gaow,i;         //k,w为输入,weis为位数,gaow为有效最高位的数值,i用于循环
	scanf("%d%d",&k,&w);
	max=pow(2.0,k);             //以题中输入3,7为例,max=8,表示八进制
	weis=w/k+1;                 //weis位数为3
	gaow=pow(2.0,w%k)-1;        //gaow为最高位数值为1
	if (max-weis<=gaow)         //根据题目,可知最高位的数字最大为max-weis,故为gaow赋予有效最高位数值
		gaow=max-weis;      //gaow等于1
	for (i=2;i<weis;i++)        //从第二位开始(从右往左),对每一位数时计算排列数
		sum+=C(max-i,i);    //给sum求和
	sum+=(C(max-weis,weis)-C(max-weis-gaow,weis));    //计算最高位时的排列数
	printf("%ld",sum);
}
long C(int n,int m)                 //公式为C(n+m-1)(m)[重点]
{
	int i;
	long sum=1;
	for (i=1;i<=m;i++)
		sum*=(n+m-i);	
	for (i=1;i<=m;i++)
		sum=sum/i;
	return sum;
}

解题思路:
数学问题




注意事项:
声明变量时的类型




参考代码:

 

0.0分

0 人评分

  评论区

大牛,我实在不理解为什么要用C(n+m-1)(m)计算,我直接用C(n+1)(m)计算显示是对的,参考你的写了篇题解
2018-09-02 00:14:38
奥,你这个我懂了,但是为啥这样写就不越界了,我直接用Cnm计算的就越界
2018-02-01 20:50:39
大佬,为啥你的排列组合用的这种公式,n+m-1能不能再解释一下,还有就是看你程序也没有处理高精度,为啥没有越界,我的最后出现越界情况?
2018-02-01 20:22:12
沙发,前排围观大神
赋予代码灵魂,追求极致性能
2017-10-20 21:50:03
  • «
  • 1
  • »