XTU-OJ 组合数

题目描述

2n=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的组合数之和的表达式 c语言写

输入

每行一个整数n,如果n为负数则输入结束。

输出

每行输出一个表达式,表达式格式形似为2^n=C(n,0)+C(n,1)+…+C(n,n)。

样例输入

2
3
-1

样例输出

2^2=1+2+1
2^3=1+3+3+1

解题思路

这道题目可以使用杨辉三角来更加直观地理解并计算出结果。

杨辉三角是一个数字三角形,其中每个数字都是它上方两个数字之和:

              1
           1     1
        1     2     1
     1     3     3     1
  1     4     6     4     1

因为每个数字都是它上方两个数字之和,而 C(n, x) 表示的是从 n 个元素中选择 x 个元素的组合数,所以可以将杨辉三角中的每个数视为对应的组合数 C(n, x)。也就是说,杨辉三角第 n 行第 x 列的数字为 C(n, x)。

因此,我们可以先计算出与 2^n 相对应的杨辉三角第 n+1 行(因为行数从 0 开始计数,所以与题目要求的范围 n 对应的行数为 n+1),然后将该行中的所有数字相加,就得到了 2^n 的组合数之和。

样例代码

#include<stdio.h>

void pd(int n) {
    
    
    printf("2^%d=", n);

    float result;
    for (int i = 0; i <= n; i++) {
    
    
        result = 1;
        for (int j = 0; j < i; j++) {
    
    
            if (i == j){
    
    
                result = 1;
            }
            else {
    
    
                result = result * (n - j) / (i - j);
            }
        }
        printf("%.f", result);
        if (i != n){
    
    
            printf("+");
        }
        else {
    
    
            printf("\n");
        }
    }
}

int main(){
    
    
    int n;
    while (scanf("%d", &n)) {
    
    
        if (n < 0)
            break;
        pd(n);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_53961667/article/details/134344874