结构之法 算法之道 面试题 9、编程实现两个正整数的除法 编程实现两个正整数的除法,当然不能用除法操作符。


微软面试题  

编程实现两个正整数的除法

编程实现两个正整数的除法,当然不能用除法操作符。
// return x/y.
int div(const int x, const int y) 
{
  ....

}


答案解析 

类似折半查找

常人会从1,2,3,4,5,6。。。。n。。。。这么一直试下去,发现=效率很低,为什么不学学折半查找呢,查找商值,

我会这么做

(1)先查找出一个商的范围,这个跳转很快的,我个人认为 O(log 正无穷 )

我设的范围 是 (1,2),(3,6),(7,14),(15,30)。。。。。。。。

直到找到 (m,n), m <= 商值 <= n )

(2) 折半查找就好了 O(log n)

总结  总的时间复杂度为O( log 正无穷 +log n)


实验数据


experiment result(文本,这次没有上传照片,太长了,不好截图,请谅解)

请输入正整数 x,y
23421543534
34
x = 1946707054, y = 34,d = 1
x = 1946707054, y = 34,d = 2
x = 1946707054, y = 34,d = 2
x = 1946707054, y = 34,d = 3
x = 1946707054, y = 34,d = 6
x = 1946707054, y = 34,d = 6
x = 1946707054, y = 34,d = 7
x = 1946707054, y = 34,d = 14
x = 1946707054, y = 34,d = 14
x = 1946707054, y = 34,d = 15
x = 1946707054, y = 34,d = 30
x = 1946707054, y = 34,d = 30
x = 1946707054, y = 34,d = 31
x = 1946707054, y = 34,d = 62
x = 1946707054, y = 34,d = 62
x = 1946707054, y = 34,d = 63
x = 1946707054, y = 34,d = 126
x = 1946707054, y = 34,d = 126
x = 1946707054, y = 34,d = 127
x = 1946707054, y = 34,d = 254
x = 1946707054, y = 34,d = 254
x = 1946707054, y = 34,d = 255
x = 1946707054, y = 34,d = 510
x = 1946707054, y = 34,d = 510
x = 1946707054, y = 34,d = 511
x = 1946707054, y = 34,d = 1022
x = 1946707054, y = 34,d = 1022
x = 1946707054, y = 34,d = 1023
x = 1946707054, y = 34,d = 2046
x = 1946707054, y = 34,d = 2046
x = 1946707054, y = 34,d = 2047
x = 1946707054, y = 34,d = 4094
x = 1946707054, y = 34,d = 4094
x = 1946707054, y = 34,d = 4095
x = 1946707054, y = 34,d = 8190
x = 1946707054, y = 34,d = 8190
x = 1946707054, y = 34,d = 8191
x = 1946707054, y = 34,d = 16382
x = 1946707054, y = 34,d = 16382
x = 1946707054, y = 34,d = 16383
x = 1946707054, y = 34,d = 32766
x = 1946707054, y = 34,d = 32766
x = 1946707054, y = 34,d = 32767
x = 1946707054, y = 34,d = 65534
x = 1946707054, y = 34,d = 65534
x = 1946707054, y = 34,d = 65535
x = 1946707054, y = 34,d = 131070
x = 1946707054, y = 34,d = 131070
x = 1946707054, y = 34,d = 131071
x = 1946707054, y = 34,d = 262142
x = 1946707054, y = 34,d = 262142
x = 1946707054, y = 34,d = 262143
x = 1946707054, y = 34,d = 524286
x = 1946707054, y = 34,d = 524286
x = 1946707054, y = 34,d = 524287
x = 1946707054, y = 34,d = 1048574
x = 1946707054, y = 34,d = 1048574
x = 1946707054, y = 34,d = 1048575
x = 1946707054, y = 34,d = 2097150
x = 1946707054, y = 34,d = 2097150
x = 1946707054, y = 34,d = 2097151
x = 1946707054, y = 34,d = 4194302
x = 1946707054, y = 34,d = 4194302
x = 1946707054, y = 34,d = 4194303
x = 1946707054, y = 34,d = 8388606
x = 1946707054, y = 34,d = 8388606
x = 1946707054, y = 34,d = 8388607
x = 1946707054, y = 34,d = 16777214
x = 1946707054, y = 34,d = 16777214
x = 1946707054, y = 34,d = 16777215
x = 1946707054, y = 34,d = 33554430
x = 1946707054, y = 34,d = 33554430
x = 1946707054, y = 34,d = 33554431
x = 1946707054, y = 34,d = 67108862
x = 1946707054, y = 34,d = 67108862
x = 1946707054, y = 34,d = 50331646
x = 1946707054, y = 34,d = 50331646
x = 1946707054, y = 34,d = 50331647
x = 1946707054, y = 34,d = 67108861
x = 1946707054, y = 34,d = 67108861
x = 1946707054, y = 34,d = 58720254
x = 1946707054, y = 34,d = 58720254
x = 1946707054, y = 34,d = 58720254
x = 1946707054, y = 34,d = 50331648
x = 1946707054, y = 34,d = 58720253
x = 1946707054, y = 34,d = 58720253
x = 1946707054, y = 34,d = 54525950
x = 1946707054, y = 34,d = 54525950
x = 1946707054, y = 34,d = 54525951
x = 1946707054, y = 34,d = 58720252
x = 1946707054, y = 34,d = 58720252
x = 1946707054, y = 34,d = 56623101
x = 1946707054, y = 34,d = 56623101
x = 1946707054, y = 34,d = 56623102
x = 1946707054, y = 34,d = 58720251
x = 1946707054, y = 34,d = 58720251
x = 1946707054, y = 34,d = 57671676
x = 1946707054, y = 34,d = 57671676
x = 1946707054, y = 34,d = 57671676
x = 1946707054, y = 34,d = 56623103
x = 1946707054, y = 34,d = 57671675
x = 1946707054, y = 34,d = 57671675
x = 1946707054, y = 34,d = 57147389
x = 1946707054, y = 34,d = 57147389
x = 1946707054, y = 34,d = 57147390
x = 1946707054, y = 34,d = 57671674
x = 1946707054, y = 34,d = 57671674
x = 1946707054, y = 34,d = 57409532
x = 1946707054, y = 34,d = 57409532
x = 1946707054, y = 34,d = 57409532
x = 1946707054, y = 34,d = 57147391
x = 1946707054, y = 34,d = 57409531
x = 1946707054, y = 34,d = 57409531
x = 1946707054, y = 34,d = 57278461
x = 1946707054, y = 34,d = 57278461
x = 1946707054, y = 34,d = 57278461
x = 1946707054, y = 34,d = 57147392
x = 1946707054, y = 34,d = 57278460
x = 1946707054, y = 34,d = 57278460
x = 1946707054, y = 34,d = 57212926
x = 1946707054, y = 34,d = 57212926
x = 1946707054, y = 34,d = 57212927
x = 1946707054, y = 34,d = 57278459
x = 1946707054, y = 34,d = 57278459
x = 1946707054, y = 34,d = 57245693
x = 1946707054, y = 34,d = 57245693
x = 1946707054, y = 34,d = 57245694
x = 1946707054, y = 34,d = 57278458
x = 1946707054, y = 34,d = 57278458
x = 1946707054, y = 34,d = 57262076
x = 1946707054, y = 34,d = 57262076
x = 1946707054, y = 34,d = 57262076
x = 1946707054, y = 34,d = 57245695
x = 1946707054, y = 34,d = 57262075
x = 1946707054, y = 34,d = 57262075
x = 1946707054, y = 34,d = 57253885
x = 1946707054, y = 34,d = 57253885
x = 1946707054, y = 34,d = 57253886
x = 1946707054, y = 34,d = 57262074
x = 1946707054, y = 34,d = 57262074
x = 1946707054, y = 34,d = 57257980
x = 1946707054, y = 34,d = 57257980
x = 1946707054, y = 34,d = 57257980
x = 1946707054, y = 34,d = 57253887
x = 1946707054, y = 34,d = 57257979
x = 1946707054, y = 34,d = 57257979
x = 1946707054, y = 34,d = 57255933
x = 1946707054, y = 34,d = 57255933
x = 1946707054, y = 34,d = 57255934
x = 1946707054, y = 34,d = 57257978
x = 1946707054, y = 34,d = 57257978
x = 1946707054, y = 34,d = 57256956
x = 1946707054, y = 34,d = 57256956
x = 1946707054, y = 34,d = 57256956
x = 1946707054, y = 34,d = 57255935
x = 1946707054, y = 34,d = 57256955
x = 1946707054, y = 34,d = 57256955
x = 1946707054, y = 34,d = 57256445
x = 1946707054, y = 34,d = 57256445
x = 1946707054, y = 34,d = 57256445
x = 1946707054, y = 34,d = 57255936
x = 1946707054, y = 34,d = 57256444
x = 1946707054, y = 34,d = 57256444
x = 1946707054, y = 34,d = 57256190
x = 1946707054, y = 34,d = 57256190
x = 1946707054, y = 34,d = 57256190
x = 1946707054, y = 34,d = 57255937
x = 1946707054, y = 34,d = 57256189
x = 1946707054, y = 34,d = 57256189
x = 1946707054, y = 34,d = 57256063
x = 1946707054, y = 34,d = 57256063
x = 1946707054, y = 34,d = 57256064
x = 1946707054, y = 34,d = 57256188
x = 1946707054, y = 34,d = 57256188
x = 1946707054, y = 34,d = 57256126
x = 1946707054, y = 34,d = 57256126
x = 1946707054, y = 34,d = 57256126
x = 1946707054, y = 34,d = 57256065
x = 1946707054, y = 34,d = 57256125
x = 1946707054, y = 34,d = 57256125
x = 1946707054, y = 34,d = 57256095
x = 1946707054, y = 34,d = 57256095
x = 1946707054, y = 34,d = 57256095
x = 1946707054, y = 34,d = 57256066
x = 1946707054, y = 34,d = 57256094
x = 1946707054, y = 34,d = 57256094
x = 1946707054, y = 34,d = 57256080
x = 1946707054, y = 34,d = 57256080
x = 1946707054, y = 34,d = 57256081
x = 1946707054, y = 34,d = 57256093
x = 1946707054, y = 34,d = 57256093
x = 1946707054, y = 34,d = 57256087
x = 1946707054, y = 34,d = 57256087
x = 1946707054, y = 34,d = 57256088
x = 1946707054, y = 34,d = 57256092
x = 1946707054, y = 34,d = 57256092
x = 1946707054, y = 34,d = 57256090
x = 1946707054, y = 34,d = 57256090
x = 1946707054, y = 34,d = 57256090
x = 1946707054, y = 34,d = 57256089
商=57256089
请按任意键继续. . .


代码实现

test_01.cpp

// test_01.cpp : Defines the entry point for the console application.
//

#include<stdio.h>
#include<stdlib.h> 

int main()
{
	int half(int m,int n,int x,int y);
	int x,y,result;


	printf("请输入正整数 x,y \n");
	scanf("%d",&x);
	scanf("%d",&y);
	result=half(1,2,x,y);
	printf("商=%d \n",result) ;
	system("pause");
	return 0;
}


// 类似折半查找商值:running time(log n)
/* functiong check()
input(m,n,x,y)
out result

if( m <=result<=n )
   折半查找就ok
else return half( n+1,2*n+2 ,x,y )
*/
int half(int m,int n,int x,int y)
{
	int check(int x,int y, int d);

	if(check(x,y,m)==0 )
	{
		return m ;
	}
	else if( check(x,y,n)==0 )
	{
		return n;
	}
    else if( check(x,y,n) == -1 )
	{
		if( check(x,y,(n+m)/2) == 0 )
			return (n+m)/2;
		else if( check(x,y,(n+m)/2) == 1 )
			return half( (n+m)/2+1,n-1,x,y );
		else if( check(x,y,(n+m)/2) == -1 )
			return half( m+1,(n+m)/2-1,x,y );
	}
    else return half( n+1,2*n+2,x,y );

}


// check the relation of the right result and d :running time(1)
/* functiong check()
input(x,y,d)
if( d==result )
   return 0;
else if( d>result )
   return -1;
else return 1;
*/

int check(int x,int y, int d)
{
	printf( "x = %d, y = %d,d = %d\n",x,y,d );
	if( x-d*y<y && x-d*y>=0 )
	{		
		return 0 ;
	}
	else if( x-d*y>=y )
	{
		return 1;
	}
	else if( x-d*y< 0 )
	{
		return -1;
	}
}


上面包含不严谨之处,前几天经过有心善良之人提醒,于2017-6-16 16:34 更新

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<limits.h>

//#define INT_MAX 0x7fffffff


unsigned int half(unsigned int m,unsigned int n,unsigned int x,unsigned int y);
unsigned int check(unsigned int x,unsigned int y, unsigned int d);
unsigned int max(unsigned int a, unsigned int b);
unsigned int min(unsigned int a, unsigned int b);


unsigned int main(unsigned int argc, char *argv[])
//unsigned int main()
{
    unsigned int x, y, result;
    char** left;
    printf("正整数 x = %s, y = %s \n", argv[1], argv[2]);
    x = atoi(argv[1]);
    y = atoi(argv[2]);
    result=half(1,y,x,y);
    printf("商=%u \n", result);
    return 0;
}


unsigned int half(unsigned int m,unsigned int n,unsigned int x,unsigned int y)
{
    unsigned int dis;
    printf( "m = %u, n = %u, x = %u, y = %u, check m = %u, check n = %u \n", m,n,x,y, check(x, y, m), check(x, y, n));
    if(check(x,y,m)==-1){
        return 0;
    }
    else if(check(x,y,m)==0 )
    {
        return m ;
    }
    else if( check(x,y,n)==0 )
    {
        return n;
    }
    else if( check(x,y,n) == -1 )
    {
        dis = sqrt(n-m);
        dis = dis * sqrt(dis);
        return max(half(m,m+dis,x,y), half(m+dis+1,n,x,y));
    }
    else return half( n+1, min(INT_MAX ,pow(n+1, 2)), x, y );
}

// max : max of a and b

unsigned int max(unsigned int a, unsigned int b)
{
    return a > b ? a : b ;
}

// min : min of a and b
unsigned int min(unsigned int a, unsigned int b)
{
    return a > b ? b : a ;
}

// check: d 和 正确商的距离
unsigned int check(unsigned int x,unsigned int y, unsigned int d)
{
    if( y*d <= x && y*(d+1) > x)
    {
        return 0 ;
    }
    else if( y*(d+1) <= x )
    {
        return 1;
    }
    else if(y*d > x)
    {
        return -1;
    }
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值