一个C语言组合数问题,求高手解答(本人C语言新手,别笑话啊)

时间:2022-08-01 07:12:27
2^n=C(n,0)+C(n,1)+…+C(n,n)。其中^表示幂,C(n,x)表示组合数,即C(n,x)=n!/((n-x)!x!)。现在给你n(0<=n<=33),要你输出2^n的组合数之和的表达式 
输入:
每行一个整数n,如果n为负数则输入结束。
输出:
每行输出一个表达式,表达式格式形似为2^n=C(n,0)+C(n,1)+…+C(n,n)。
Sample Input
2
3
-1
Sample Output
2^2=1+2+1
2^3=1+3+3+1


老师说利用杨辉三角做,我查了下杨辉三角的程序,再写下来这个程序,但总是输不出想要的结果,望高手解答(不要笑话我啊o(>﹏<)o),我的程序如下:
#include<stdio.h>
int main ()
{
    unsigned int n,i,j,a[100][100];
    while(scanf("%d",&n)==1)
    {
       if(n<0)break;
       for(i=0;i<=n;i++)
       {
           a[i][0]=1;
           a[i][i]=1;
       }
       for(i=2;i<n;i++)
       {
           for(j=1;j<n;j++)
          {
              a[i][j]=a[i-1][j-1]+a[i-1][j];
          }
       }
       printf("2^%d=",n);
       for(i=0;i<=n;i++)
       {
           for(j=0;j<i;j++)
           {printf("%d+",a[i][j]);}
       }
       printf("%d",a[n][n]);
        printf("\n");
    }
    return 0;
}


5 个解决方案

#1


楼主公式用错了吧
但是我也忘了
C(n,x) = a * C(n,x-1) + b * C(n-1, x); a,b都是啥,我忘了

#2


#include<stdio.h>
int main ()
{
  unsigned int n,i,j,a[100][100];
  while(scanf("%d",&n)==1)
  {
  if(n<0)break;
  for(i=0;i<=n;i++)
  {
  a[i][0]=1;
  a[i][i]=1;
  }
  for(i=2;i<=n;i++)//
  {
  for(j=1;j<i;j++)//
  {
  a[i][j]=a[i-1][j-1]+a[i-1][j];
  }
  }
  printf("2^%d=",n);
  i=n;   //
  for(j=0;j<i;j++)
  {printf("%d+",a[i][j]);}
  printf("%d",a[i][i]);
  printf("\n");
  }
  return 0;
}

#3


2楼好像不太对

#4


这些写可以减少内存的使用情况,提高效率
#include<stdio.h>

int jc(int n)
{
int k;
if(n == 0)
k  = 1;
else
k = jc(n - 1) * n;
return k;

}
void fs(int n)
{
int i,k;
printf("2^%d=",n);
for(i = 0; i < n; i++)
{
k = jc(n)/(jc(n-i)*jc(i)) ;
printf("%d+",k);
}
printf("1\n");
}
void main()
{
int t;

while(scanf("%d",&t) == 1 && t >= 0  && t <= 33)
{
fs(t);
}
}

#1


楼主公式用错了吧
但是我也忘了
C(n,x) = a * C(n,x-1) + b * C(n-1, x); a,b都是啥,我忘了

#2


#include<stdio.h>
int main ()
{
  unsigned int n,i,j,a[100][100];
  while(scanf("%d",&n)==1)
  {
  if(n<0)break;
  for(i=0;i<=n;i++)
  {
  a[i][0]=1;
  a[i][i]=1;
  }
  for(i=2;i<=n;i++)//
  {
  for(j=1;j<i;j++)//
  {
  a[i][j]=a[i-1][j-1]+a[i-1][j];
  }
  }
  printf("2^%d=",n);
  i=n;   //
  for(j=0;j<i;j++)
  {printf("%d+",a[i][j]);}
  printf("%d",a[i][i]);
  printf("\n");
  }
  return 0;
}

#3


2楼好像不太对

#4


这些写可以减少内存的使用情况,提高效率
#include<stdio.h>

int jc(int n)
{
int k;
if(n == 0)
k  = 1;
else
k = jc(n - 1) * n;
return k;

}
void fs(int n)
{
int i,k;
printf("2^%d=",n);
for(i = 0; i < n; i++)
{
k = jc(n)/(jc(n-i)*jc(i)) ;
printf("%d+",k);
}
printf("1\n");
}
void main()
{
int t;

while(scanf("%d",&t) == 1 && t >= 0  && t <= 33)
{
fs(t);
}
}