zoukankan      html  css  js  c++  java
  • 算法15---数论7---一些细节题

    算法15---数论7---一些细节题

    1 整除,求余数
    算法导论:31.1-12 试写出计算β位整除除以短整数的高效算法,以及计算β位整数除以短整数的余数的高效算法。所给出的算法运行时间应为θ(β^2).
     
     1 //位运算的乘法与除法
     2 #include <stdio.h>
     3 
     4 
     5 
     6 //位运算的乘法
     7 int bit_Multiplication(int a,int b)
     8 {
     9      int ans=0;
    10      for (int i=1;i;i<<=1,a<<=1)
    11      {
    12          if (b&i)
    13          {
    14              ans+=a;
    15          }
    16      }
    17      return ans;
    18 }
    19 //位运算的除法
    20 int bit_Division1(int x,int y)
    21 {
    22     int ans=0;
    23     for (int i=31;i>=0;i--)
    24     {
    25         if ((x>>i)>=y)
    26         {
    27             ans+=(1<<i);
    28             x-=(y<<i);
    29         }
    30     }
    31     return ans;
    32 }
    33 //计算整数的二进制位数
    34 int bit_num(int d)
    35 {
    36    int i=0;
    37    while (d)
    38    {
    39        d>>=1;
    40        i++;
    41    }
    42    return i;
    43 }
    44 //位运算的除法 计算商
    45 int bit_Division2_quotient(int x,int y)
    46 {
    47     int c2=bit_num(x),c1=bit_num(y),quotient=0;
    48     for (int i=c2-c1;i>=0;i--)//i=c2-c1防止除数y移位后超过无符号整数最大值 时间复杂度O(c2-c1)
    49     {
    50         unsigned int a=(y<<i);//有了i=c2-c1保证了y<<i不会溢出 a有c1+c2-c1=c2位
    51         if (a<=x)
    52         {
    53             quotient+=(1<<i);
    54             x-=a;
    55         }
    56     }
    57     //总的时间复杂度为 O(c2)=O(x的二进制位数)=O(b^2) b为除数的十进制位数
    58     return quotient;
    59 }
    60 //位运算的除法 计算余数 与计算商一样,只是返回值不同
    61 int bit_Division2_Remainder(int x,int y)
    62 {
    63     int c2=bit_num(x),c1=bit_num(y),quotient=0;
    64     for (int i=c2-c1;i>=0;i--)//i=c2-c1防止除数y移位后超过无符号整数最大值 时间复杂度O(c2-c1)
    65     {
    66         unsigned int a=(y<<i);//有了i=c2-c1保证了y<<i不会溢出 a有c1+c2-c1=c2位
    67         if (a<=x)
    68         {
    69             quotient+=(1<<i);
    70             x-=a;
    71         }
    72     }
    73     //总的时间复杂度为 O(c2)=O(x的二进制位数)=O(b^2) b为除数的十进制位数
    74     return x;
    75 }
    76 
    77 
    78 int  main()
    79 {
    80     printf("%d
    ", bit_Multiplication(350,43));
    81     printf("%d
    ", bit_Division1(350,43));
    82     printf("divide:%d
    ", bit_Division2_quotient(350,43));
    83     printf("remainder :%d
    ", bit_Division2_Remainder(350,43));
    84 
    85     return 0;
    86 }
    2 二进制转10进制
         31.1-13 写出一个高效算法,用于将β位二进制整数转化为响应的十进制表示。证明:如果长度至多为β的整数的乘法或除法运算所需时间为M(β),则执行二进制到十进制转换所需时间为θ(M(β)lgβ)。(提示:应用分治法,分别使用独立的递归计算结果的前段和后段)。
     
    /*
        题目:最大公约数
        author taoliu——alex  2016.10   number5
    
        主要实现:
        2-10,递归实现
    
    */
    
    
    
    #include <stdio.h>
    #include <string.h>
    
    #define BIT 6//二进制整数的位数,可根据所要输入的二进制位数设置BIT。
    
    //方法1,直接二进制转10进制;
    
    int Bit_merge(int a[],int p,int r)
    {
        int ans=0;
    
        for (int i=p;i<=r;i++)
        {
            ans+=a[i]<<i;       
        }
        return ans;
    }
    
    
    //方法2
    int merge(int a[],int p)
    {
        int ans=0;
        ans+=a[p]<<p;
        return ans;
    }
    
    int bit_Multiplication(int a[],int p,int r)//x为二进制数
    {
        int q;
        int sum;
        if (p==r)
        {
            sum+=merge(a,r);
        }
        if (p<r)
        {
           q=(p+r)/2;
           bit_Multiplication(a,p,q);
           bit_Multiplication(a,q+1,r);
        }
        return sum;
    }
    
    int  main()
    {
        int a[BIT]={1,0,1,1,1,0};
        printf("
    ");
        printf("%d
    ",bit_Multiplication(a,0,BIT-1) );
        return 0;
    }
    3 欧几里得算法算法的扩展形式
     
    可以利用欧几里得算法计算出满足下列条件的整系数x和y;
    d = gcd(a,b)=ax+by;
     
    算法伪代码
    extended_euclid(a,b)
    if b==0
         return(a,1,0)
    else
         (d',x',y')=extended_euclid(b,a mod b)
         (d,x,y)=(d',y'x'-a/b*y')
    return (d,x,y)
     
    /*
        题目:欧几里得算法扩展
        author taoliu——alex  2016.10   number5
    
        主要实现:
    
    */
    
    #include <stdio.h>
    
    struct a
    {
        int d;
        int x;
        int y;
    }s;
    
    struct a extended_eucild(int a,int b)
    {
        if(b==0)
        {
            s.d=a;
            s.x=1;
            s.y=0;
            return s;
        }
        else
        {
            struct a ss=extended_eucild(b,a%b);
            s.d=ss.d;
            s.x=ss.y;
            s.y=ss.x-(a/b)*ss.y;
            return s;
        }
    }
    
    int main()
    {
      struct a s=extended_eucild(899,493);
      printf("%d,%d,%d
    ",s.d,s.x,s.y );
    
      return 0;
    }
  • 相关阅读:
    Gym 100418J Lucky tickets(数位dp)
    UI各种小控件的用法
    安卓系统底层C语言算法之測试參数是几个long型的算法
    Chisel Tutorial(一)——Chisel介绍
    java中super的作用
    flume採集数据导入elasticsearch 配置
    UML中的序列图(时序图)
    简单的Queue
    UNIX环境高级编程(5):文件I/O(1)
    四、基于HTTPS协议的12306抢票软件设计与实现--水平DNS并发查询分享
  • 原文地址:https://www.cnblogs.com/tao-alex/p/5948738.html
Copyright © 2011-2022 走看看