算法笔记_day1_循环设计

累加:S(N)=S(N-1)+a;

累乘:  S(N)=S(N-1)*a;

ey:求:1/1!-1/3!+1/5!-1/7!+...+(-1)^(n+1)/(2n-1)!

分析:这个问题既有累加也有累乘,

   数学模型:S(N)=S(N-1)+(-1)^(n+1)/(2n-1)!

算法模型:

1.求阶乘:

  for(i=2;i<=n;i++)

  {

    t=1;

    for(j=1;j<=2*i-1;j++)

      t=t*j;

  }

上面是(2n-1)!,类似的还有n!,(2n+1)!,也就是j的比较条件不同,用双层循环解决。这里面就不介绍递归了。

2.求(-1)^(n+1):

  这个就是一个旗帜,遇到偶数项时就是-1;奇数项就是+1,;

  用循环:

    sign=1;//n=1时

    for(j=1;j<=i+1;j++)

      sign=sign*(-1);//sign=-sign;

 

3.求和s:  

  int s=1;

  在内层循环里面:

  s=s+sign/t;

完整代码:

  input(n);

  float s=1,t=1;

  int i,j;

  int sign=1;

  for(i=2;i<=n;i++)

  {

    for(j=1;j<2*i-1;j++)

      t=t*j;

    for(j=1;j<i+1;j++)

      sign=sign*(-1);

    s=s+sign/t;

  }

  print(n);

算法分析:

  算法时间复杂度是O(N^2),效率太低,

  原因分析:1.当第一次求出3!,再求5!就没有必要去从1累乘到5,而是可以从3!*4*5,就是可以,

       数学模型:A(N)=A(n-1)*1/(2n-2)*1/(2n-1) 

       2.sign=-sign;也可以减少循环。n*(n-1)/2次

        对(-1)^(n+1)可以用一个变量sign记录他的值,每循环一次执行sign=-sign;

改进代码:

  int i;

  float s=1,t=1;

  input(n);

  for(i=2;i<n;++i)

  {

    sign=-sign;

    t=t*(2*i-2)*(2*i-1);

    s=s+sign/t;

  }

  print(s);

算法分析:算法时间复杂度是O(n).

           

 

posted @ 2013-04-21 14:00  wust小吴  阅读(156)  评论(0编辑  收藏  举报