题目描述
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
解题思路
这道题目可以使用杨辉三角来更加直观地理解并计算出结果。
杨辉三角是一个数字三角形,其中每个数字都是它上方两个数字之和:
扫描二维码关注公众号,回复:
17158978 查看本文章
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;
}