int div(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 += multi;
left_num -= y * multi;
}
return result;
}
先不说对不对,你给我讲讲这个的大体思路,为什么要左移,右移?
10 个解决方案
#1
左移相当于整除2余数不要,右移相当于乘以2
等价于下面的代码:
等价于下面的代码:
#include "stdafx.h"
#include <stdio.h>
int div(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/2)) {
multi = multi *2;
}
result += multi;
left_num -= y * multi;
}
return result;
}
void main(){
printf("%d\n",div(9, 3));
}
#2
这个程序大体思路其实是用减法实现除法:
下面有个简化版的:
下面有个简化版的:
#include <stdio.h>
int div(const int cx, const int y)
{
int result = 0;
int x = cx;
while (x > 0 )
{
++result;
x -= y;
}
return result;
}
void main()
{
printf("%d\n",div(9, 3));
}
#3
"左移相当于整除2余数不要,右移相当于乘以2" 有了这句话楼主还有什么疑问?
#4
思路是:
从高到低位获取商的每一位。大循环中每次循环获取商的一个bit,第一次获取最高位,以后逐个获取更低位。
比如:x/y,用如下步骤
1. 得到一个整数,这个整数n的特点是:是二的的整数次幂,并且y*n的只值不超过x,那么我们就可以的出这个n就是尚商的最高位了。
2. 假设n就是x/y的商,可的到余数r,然后对r/y重复步骤1的运算。
如此反复得到每一位。
我这是手机上给我一解答,输的手都抽筋了,回头找个电脑给你详解。
从高到低位获取商的每一位。大循环中每次循环获取商的一个bit,第一次获取最高位,以后逐个获取更低位。
比如:x/y,用如下步骤
1. 得到一个整数,这个整数n的特点是:是二的的整数次幂,并且y*n的只值不超过x,那么我们就可以的出这个n就是尚商的最高位了。
2. 假设n就是x/y的商,可的到余数r,然后对r/y重复步骤1的运算。
如此反复得到每一位。
我这是手机上给我一解答,输的手都抽筋了,回头找个电脑给你详解。
#5
while (y * multi <= (left_num >> 1)) {
multi = multi << 1;
}
此处就是为了找到不大于left_num的y*multi。 由于multi是1<<n次得到的,故multi一定是2的n次幂。
#6
反了吧
#7
应该是反了,不过貌似移位要考虑溢出吧?
#8
#9
他是说反了!
#10
6楼被围观了……
#1
左移相当于整除2余数不要,右移相当于乘以2
等价于下面的代码:
等价于下面的代码:
#include "stdafx.h"
#include <stdio.h>
int div(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/2)) {
multi = multi *2;
}
result += multi;
left_num -= y * multi;
}
return result;
}
void main(){
printf("%d\n",div(9, 3));
}
#2
这个程序大体思路其实是用减法实现除法:
下面有个简化版的:
下面有个简化版的:
#include <stdio.h>
int div(const int cx, const int y)
{
int result = 0;
int x = cx;
while (x > 0 )
{
++result;
x -= y;
}
return result;
}
void main()
{
printf("%d\n",div(9, 3));
}
#3
"左移相当于整除2余数不要,右移相当于乘以2" 有了这句话楼主还有什么疑问?
#4
思路是:
从高到低位获取商的每一位。大循环中每次循环获取商的一个bit,第一次获取最高位,以后逐个获取更低位。
比如:x/y,用如下步骤
1. 得到一个整数,这个整数n的特点是:是二的的整数次幂,并且y*n的只值不超过x,那么我们就可以的出这个n就是尚商的最高位了。
2. 假设n就是x/y的商,可的到余数r,然后对r/y重复步骤1的运算。
如此反复得到每一位。
我这是手机上给我一解答,输的手都抽筋了,回头找个电脑给你详解。
从高到低位获取商的每一位。大循环中每次循环获取商的一个bit,第一次获取最高位,以后逐个获取更低位。
比如:x/y,用如下步骤
1. 得到一个整数,这个整数n的特点是:是二的的整数次幂,并且y*n的只值不超过x,那么我们就可以的出这个n就是尚商的最高位了。
2. 假设n就是x/y的商,可的到余数r,然后对r/y重复步骤1的运算。
如此反复得到每一位。
我这是手机上给我一解答,输的手都抽筋了,回头找个电脑给你详解。
#5
while (y * multi <= (left_num >> 1)) {
multi = multi << 1;
}
此处就是为了找到不大于left_num的y*multi。 由于multi是1<<n次得到的,故multi一定是2的n次幂。
#6
反了吧
#7
应该是反了,不过貌似移位要考虑溢出吧?
#8
#9
他是说反了!
#10
6楼被围观了……