zoukankan      html  css  js  c++  java
  • 算法笔记_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).

               

  • 相关阅读:
    AD预测论文研读系列2
    hdu 5795
    sg函数的应用
    二分查找
    快速幂
    筛选法素数打表
    多校hdu-5775 Bubble sort(线段树)
    多校hdu5754(博弈)
    多校hdu5738 寻找
    多校hdu5726 线段树+预处理
  • 原文地址:https://www.cnblogs.com/wust221/p/3033863.html
Copyright © 2011-2022 走看看