给定A, B两个整数,不使用除法和取模运算,求A/B的商和余数
2013-07-01 00:25
549 查看
给定A, B两个整数,不使用除法和取模运算,求A/B的商和余数。
1. 最基本的算法是,从小到大遍历:
for (i = 2 to A -1)
if (i * B > A)
商 = i -1; 余数 = A – (i-1)*B;
2. 较好的算法是采用2分法,查找[2, A]中满足尚的解。
3. 更好的算法是采用位操作的思想来实现除法。
以除数为初始测试值,以2的指数为步长来搜索问题空间,当被除数与测试值的差小于除数时便结束搜索,若在这之前测试值大于被除数,则将被除数减去前一个测试值,并重复上述过程直到搜索结束。举个例子,求1200/3:
顺序搜索时,我们要与1200比较的数有:3,6,9,12,15,...,1998,2001,比较次数667次
以2的指数为步长搜索时,与1200比较3,6,12,24,48,96,192,384,768,1536,然后与1200-768=432再进行比较3,6,12,24,48,96,192,384,768,再取432-384=48比较3,6,12,24,48,搜索结束,比较次数共24次,比顺序搜索有很大的提高。你可能会问,为什么要以2的指数为步长来搜索呢?答案是,这样我们就可以使用位操作来进一步提高计算效率了。下面是这个算法的实现:
intinteger_div_1(unsigned int dividend, unsigned int divisor)
{
if(divisor == 0)
{
cout<<"非法参数,除零错"<<endl;
exit(1);
}
if(dividend< divisor) return 0;
unsigned int k=0,c=divisor, res=0;
for(;dividend>=c;c<<=1,k++)
if(dividend-c < divisor)
return 1<<k;
return integer_div_1(dividend-(c>>1),divisor)+(1<<(k-1));
}
1. 最基本的算法是,从小到大遍历:
for (i = 2 to A -1)
if (i * B > A)
商 = i -1; 余数 = A – (i-1)*B;
2. 较好的算法是采用2分法,查找[2, A]中满足尚的解。
3. 更好的算法是采用位操作的思想来实现除法。
以除数为初始测试值,以2的指数为步长来搜索问题空间,当被除数与测试值的差小于除数时便结束搜索,若在这之前测试值大于被除数,则将被除数减去前一个测试值,并重复上述过程直到搜索结束。举个例子,求1200/3:
顺序搜索时,我们要与1200比较的数有:3,6,9,12,15,...,1998,2001,比较次数667次
以2的指数为步长搜索时,与1200比较3,6,12,24,48,96,192,384,768,1536,然后与1200-768=432再进行比较3,6,12,24,48,96,192,384,768,再取432-384=48比较3,6,12,24,48,搜索结束,比较次数共24次,比顺序搜索有很大的提高。你可能会问,为什么要以2的指数为步长来搜索呢?答案是,这样我们就可以使用位操作来进一步提高计算效率了。下面是这个算法的实现:
intinteger_div_1(unsigned int dividend, unsigned int divisor)
{
if(divisor == 0)
{
cout<<"非法参数,除零错"<<endl;
exit(1);
}
if(dividend< divisor) return 0;
unsigned int k=0,c=divisor, res=0;
for(;dividend>=c;c<<=1,k++)
if(dividend-c < divisor)
return 1<<k;
return integer_div_1(dividend-(c>>1),divisor)+(1<<(k-1));
}
相关文章推荐
- 使用main函数的参数,实现一个整数计算器,程序可以接受三个参数,第一个参数“-a”选项执行加法,“-s”选项执行减法,“-m”选项执行乘法,“-d”选项执行除法,后面两个参数为操作数。
- 使用main函数的参数,实现一个整数计算器,程序可以接受三个参数,第一个参数“-a”选项执行加法,“-s”选项执行减法,“-m”选项执行乘法,“-d”选项执行除法,后面两个参数为操作数。
- 使用main函数的参数,实现一个整数计算器,程序可以接受三个参数,第一个参数“-a”选项执行加法,“-s”选项执行减法,“-m”选项执行乘法,“-d”选项执行除法,后面两个参数为操作数。
- 使用main函数的参数,实现一个整数计算器,程序可以接受三个参数,第一个参数“-a”选项执行加法,“-s”选项执行减法,“-m”选项执行乘法,“-d”选项执行除法,后面两个参数为操作数。
- 使用main函数的参数,实现一个整数计算器,程序可以接受三个参数,第一个参数“-a”选项执行加法,“-s”选项执行减法,“-m”选项执行乘法,“-d”选项执行除法,后面两个参数为操作数。
- 给定一个整数数组,两个数字的返回索引将它们加到一个特定的目标中。 您可以假设每个输入都只有一个解决方案,并且您可能不会两次使用相同的元素。
- 不用乘法、除法及取模运算,构造两个整数的除法
- 华为机试题:输入两个超长整型构成的字符串,其间使用一个空格分隔,每个字符串最大长度为100个字符。求第一个整数除以第二个整数以后的余数。。
- 使用main函数的参数,实现一个整数计算器,程序可以接受三个参数,第一个参数“-a”选项执行加法,“-s”选项执行减法,“-m”选项执行乘法,“-d”选项执行除法,后面两个参数为操作数。
- 使用main函数的参数,实现一个整数计算器,程序可以接受三个参数,第一个参数“-a”选项执行加法,“-s”选项执行减法,“-m”选项执行乘法,“-d”选项执行除法,后面两个参数为操作数。
- 给定一个10位的整数组成的串,形式如: d1d2d3d4d5d6d7d8d9d10 。 其中最后的一位(即 )是校验和,其使用以下运算规则以前面的9位上的整数作为参数获得结果
- 写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号
- 给出两个整数a和b, 求他们的和, 但不能使用 + 等数学运算符。
- 【11】不能使用四则运算求两个整数的和
- 又来一题咯:求两个整数的之和,要求在函数体内不得使用+、-、×、÷、++、- -
- 给定一个未排序的整数数组,找到第一个缺失的正整数 您的算法应在O(n)时间运行,并使用恒定空间。
- 输入两个整数,将他们安有大到小的顺序输出。要求使用变量的引用
- 写一个函数,求两个整数的之和,要求在函数体内不得使用+、-、×、÷
- java每日一题:给定一个整数数组arr和整数target,返回两个索引值,使得这两个索引值对应的整数的和等于target。(arr中有且仅有一组)
- Help Tomisu UVA - 11440 难推导+欧拉函数,给定正整数N和M, 统计2和N!之间有多少个整数x满足,x的所有素因子都大于M (2<=N<=1e7, 1<=M<=N, N-M<=1E5) 输出答案除以1e8+7的余数。