您的位置:首页 > 职场人生

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

2013-11-03 00:24 459 查看

微软面试题  

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

编程实现两个正整数的除法,当然不能用除法操作符。
// 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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息