-
求和1+3!+ 5!+7!+.....+(2n-1)!
-
台阶问题,n个台阶,问有多少种不同的方法跨到第n阶,
条件:每步只能跨一个台阶或2个台阶
首先介绍一种看起来比较炫酷实际非常垃圾,为什么垃圾呢?因为他的时间复杂度还是O(n^2)
int fun10(int n){
if(n==1) return 1;
return fun(n-1)*n;
}
接着在main中:
int s,n;
s = 0;
n = 2;
for(int i=1;i<=2*n-1;i++){
if(i%2!=0){
s+=fun(i);
}
}
printf("%d",s);
既然垃圾,那么自然要寻求一种B格高一点又不失初心的求解咯
void fun11(){
int i = 1;
int s = 0;
int n = 2;
int t = 1;
while(i<=2*n-1){
t=t*i;
if(i%2!=0) s+=t; #青涩的我对于问题的手腕呐! //手动狗头
i++;
}
printf("%d",s);
}
void fun12(){
int i = 2;
int s = 0;
int n = 2;
int t = 1;
while(i<=n){
t=t*(2*i-1)*(2*i-2); #老师的解决
#a左t:要求的第i项的值:{2(i-1) - 1}!; (请忽略那个字母a我只想让字发光)
#a右t: 前一项的值:{2*(i-2)-1 }! 与要求的左t 差 (2*i-1)*(2*i-2)倍
#eg:i=2 1!+3! 第i=2项就是 3!(左t)= 1!(右t) * 2*3
s+=t;
i++;
}
printf("%d",s);
}
- 求组合数{C(n,m)}递归和循环两种算法实现
void fun20(int a[][],int n,int m){
#使用循环计算组合数
/*
C(1,1) = 1
C(2,1) = 2 C(2,2) = 1;
C(3,1) = 3 C(3,2) = 3; C(3,3)=1
C(4,1) = 4 C(4,2) = 6; C(4,3)=4; C(4,4)=1
eg:C(4,2) = C(3,1) + C(3,2) = C(3,1) + {C(2,2) + C(2,1)}
so:C(n,m) = C(n-1,m-1) + C(n-1,m)
*/
for(int i=1;i<=n;i++){
a[i][1] = i;
a[i][i] = 1;
for(int j=2;j<i;j++){
a[i][j] = a[i-1][j-1] + a[i-1][j];
}
}
return a[n][m];
}
网友评论