不使用除法实现除法运算 和模运算

代码如下。包含测试代码

原理就是:枚举二进制余数中1的位置 +二分搜索。O(32*32) 

不过此算法可以加上两重的二分搜索。时间复杂度会更优。

#include  < stdio.h >
#include 
< stdlib.h >
#include 
< iostream >
#include 
< vector >
#include 
< map >
#include 
< string >
#include 
< time.h >
using   namespace  std;
void  module( int  a , int  b , int   * c, int * d)
{
    
if  (a  <  b)
    {
        
* =   0 ;
        
* d   =  a;
        
return  ;
    }
    unsigned 
int  k  =   0 ;
    
int  t   =   32 ;
    
for  (   int  j  =   0 ; j <  t;j ++ )
    {
        
int  d  =  (a  -  b * (k + ( 1 << j)));
        
if  ( d  <   0 )
        {
            
if  (j  == 0 )
            {
                
break ;
            }
            k 
=  k + ( 1 << (j - 1 ));
            t 
=  j;
            j 
=   - 1 ; // j++
        }
        
if  (d  ==   0 )
        {
            k 
=  k + ( 1 << j);
            
break ;
        }     
    }
    
* =  k;
    
* =  a - b * k;
}
void  main()
{
    
    
int  i  =   10000 ;
    
while (i -- )
    {
        srand(time(NULL));
        
// int a = rand(),b = rand();
         int  a  =   1 ,b  =   1 ;
        
int  c,d;
        
        module(a,b,
& c, & d);
        
        
if  (c != a / ||  d  != a % b )
        {
            printf(
" %d %d  %d %d %d %d\n " ,a,b,c,d,a / b,a % b);
        }
        
// printf("finished % d\n",i );
    }
    printf(
" finished\n "  );
}

 另附上同样解法的简洁的代码

int  div1( const   int  x,  const   int  y) {
    
int  left_num  =  x;
    
int  result  =   0 ;
    
while  (left_num  >=  y) {
        
int  multi  =   1 ;
        
while  (y  *  multi  <=  (left_num  >>   1 )) 
        {
            multi 
=  multi  <<   1 ;
        }
        result 
= result  + multi;
        left_num 
=  left_num  -  y * multi;
    }
    
return  result;
}
// 优化
int  div2( const   int  x,  const   int  y) {
    unsigned 
int  left_num  =  x;
    
int  result  =   0 ;
    unsigned 
int  t  =   0x80000000 ;
    
int  move  =   0 ;
    
while (t)
    {
        
if (t <= left_num)
        {
            result 
=  result + t;
            left_num 
=  left_num  -  t;
        }
        t 
=  t >> 1 ;
    }
    
return  result;
}

 

 

 

转载于:https://www.cnblogs.com/davidluo/articles/1797192.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值