Acm2-快速幂、位运算、递归

来源:互联网 发布:企业网络信息平台构建 编辑:程序博客网 时间:2024/06/03 13:42

微笑重点:快速幂、位运算、递归

微笑详解

快速幂:

         目的:快速解决很大的数关于某一个数的取模,从而减少时空的复杂度;

        方法:分层次的累乘,每次乘以多余的数;

        步骤:

              1).确定幂的奇偶性:b%2==1或b&1==1均可;

              2).将整除数依次累乘:a=(a*a)%c;

              3).将次幂数减半:b/=2;

              4).判断次幂数是否为0,为0跳出循环,不为0继续返回指行循环体;

        样例:这里我们采用调用函数的形式:

              Int Pow1(int ,int ,int );

              5的10的18次关于1007取模

              int pow1(int a,int b,int c)

              {

                int ans;

                a=a%c;

                while(b>0)

                {

                 if(b%2==1)

                 {

                  ans=(ans*a)%c;

                 }

                 b/=2;

                 a=(a*a)%c;

                }

              return ans ;

              }

  递归:

       目的:解决重复的计算问题;通过所传的参数不同,达到预期的效果;

       样例:

 1).阶乘

       #include<stdio.h>

        int fact(int n);

         Int main()

        {

         int n;

        while(scanf("%d",&n)!=EOF)

         {

        printf("%d\n",fact(n));

        }

         return 0;

       }

      int fact (int n)

     {

    int f;

    if(n==1)

        return 1;

    else{

        f=(fact(n-1)+1)*2;

        return f;

      }

     }

2).杨辉三角 

#include<stdio.h>

int a[40][40];

int  f(int x,int y)

{

  if(y==1||y==x)

      return 1;

   if(a[x][y])

       return a[x][y];

   return  a[x][y]=f(x-1,y-1)+f(x-1,y);

}

int main()

{

    int n,i,j;

   while(scanf("%d",&n)!=EOF)

    {

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

        {

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

               printf("%d ",f(i,j));

           printf("%d\n",f(i,j));

        }

        printf("\n");

    }

    return 0;

}

原创粉丝点击