结构之法 算法之道 面试题 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,y23421543534
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; } }
相关文章推荐
- 微软面试题:编程实现两个正整数的除法,当然不能用除法操作符。
- 编程实现两个正整数的除法,当然不能用除法操作符
- 编程实现两个正整数的除法,当然不能用除法操作符。
- 编程实现两个正整数的除法,当然不能用除法操作符。
- 编程实现两个正整数的除法,当然不能用除法操作符
- java-编程实现两个正整数的除法,当然不能用除法操作符
- 编程实现两个正整数的除法,当然不能用除法操作符
- 微软面试题:编程实现两个正整数的除法,不能用除法操作符
- 编程实现两个正整数的除法,当然不能用除法操作符
- 每日一道算法题:编程实现两个数的除法,当然不能用除法操作符
- 微软面试题:编程实现两个正整数的除法
- 微软面试题:编程实现两个正整数的除法
- (笔试题)不用除法操作符,实现两个正整数的除法
- 编程实现两个正整数的除法
- 编程实现两个正整数的除法
- [每日练习]编程实现两个正整数的除法
- 9、编程实现两个正整数的除法
- 编程实现两个正整数的除法
- 编程实现两个正整数的除法
- 编程实现两个正整数的除法