如何优化除法和取模,一般来说有下的解决方案
对于除数为
2
的
n
次方的,可以采用位逻辑运算符的形式
比如
22/16
可以等价为
22>>4,;22%4
可以等价位
22-(22>>4<<4);
但如果是不其他数,比如
2344/3,45/3
,那么该怎么办?
是否可以这样这样想,除法可以转换成减法,比如
12/3
等以认为是
12-3-3
-3-3=0;
用代码可以这样表示
//假设 a/b =c-----d
c=0;
While(a>=b)
{
a-=b;
c++;
}
return c;
结合
12/3
来具体分析一下,
第一次循环
a=9;c=1;
第二次循环
a=6;c=2;
第三次循环
a=3;c=3;
第四次循环
a=0;c=4;
第五次循环
终止
通过这个方法是可以实现我们的要求的
但是对于含有负数的情况怎么办?首先我举几个例子
11
/ 3 = 3;
-11 / -3 = 3;
-11 / 3 = -3;
11/-3
= -3
由此可以发现,我们得出以下结论
正
/
正
=
正
负
/
负
=
正
负
/
正
=
负
正
/
负
=
负
因此可以把
2-4
种情况,转化为第一种情况,在对结果进行转化
此外应该注意某些非法的输入,比如除数为零,数值过大等等
那取模怎么办,
事实上,它跟除法差不多,他的核心代码如下
While(a>=b)
{
a-=b;
}
Return a;
不同的是,他返回时
a
;
当然取模也有四种情况:
正
/
正
=
正
负
/
负
=
负
负
/
正
=
负
正
/
负
=
正
同样的道理,也可以把
2-4
种情况,转化为第一种情况,在对结果进行转化。
最后代码如下
public class Operation
{
/** 关于整数的除法运算
*
*/
public static int div(int a,int b)
{
//还有一些可能的异常,没有写出来
//如果被除数为0
if(b ==0) throw new ArithmeticException("除数不能为零");
//如果a正,b正
if(a>=0 && b>= 0)
return division(a,b);
//如果a负,b负
else if(a<0 && b <0)
return division(-a,-b);
//如果a正,b负
else if(a >= 0 && b < 0)
return -division(a,-b);
//如果a负,b正
else return -division(-a,b);
}
private static int division(int a,int b)
{
int count = 0;
while(a >= b)
{
a-=b;
count++;
}
return count;
}
/** 关于整数的取模运算
*
*/
public static int mod(int a,int b)
{
//还有一些可能的异常,没有写出来
//如果被除数为0
if(b ==0) throw new ArithmeticException("除数不能为零");
//如果a正,b正
if(a>=0 && b> 0)
return modulo(a,b);
//如果a负,b负
else if(a<0 && b <0)
return -modulo(-a,-b);
//如果a正,b负
else if(a >= 0 && b < 0)
return modulo(a,-b);
//如果a负,b正
else return -modulo(-a,b);
}
private static int modulo(int a,int b)
{
int count = 0;
while(a >= b)
{
a-=b;
}
return a;
}
public static void main(String[] args) throws Exception
{
System.out.println(Operation.div(11,3));
System.out.println(Operation.div(-11,-3));
System.out.println(Operation.div(-11,3));
System.out.println(Operation.div(11,-3));
System.out.println(Operation.mod(11,3));
System.out.println(Operation.mod(-11,-3));
System.out.println(Operation.mod(-11,3));
System.out.println(Operation.mod(11,-3));
}
}
分享到:
相关推荐
在数字电路设计中,取模运算对于各种应用如计数器、除法器以及密码学等都是至关重要的。Cordic算法通过迭代方式,逐次调整输入向量,直到达到期望的目标值,这使得它在资源有限的FPGA或ASIC设计中特别有用。 Cordic...
在模运算中,我们通常对一个数进行除法后取模,以获取该数在模意义下的等价类。例如,7 mod 3 = 1,意味着7在模3的情况下与1相同。模运算在密码学、数据编码和计算机算法设计中都有重要应用。 总之,带余除法是...
在C++语言中,情况与C语言类似,但在早期标准(如C++03)中,对于除法和取模运算中余数的正负号没有明确规定。不过,C++11标准则明确余数应该是非负的,当两个操作数同为非负时。然而,对于C++的早期标准,仍存在对...
除法器在CPU中主要用于执行除法和取模操作,对于浮点运算和数学函数的计算尤为重要。 FPGA设计是电子工程和计算机科学的一个分支,允许开发者根据需求定制硬件。与ASIC(应用特定集成电路)相比,FPGA具有更高的...
此外,还有取模运算符`%`,用于获取除法的余数,可用于判断是否为整除。 四、控制流程 为了让用户能够多次进行计算,我们需要循环结构。可以使用`while`、`for`等循环语句。例如,用`while`实现一个简单的循环: `...
模二除法是实现CRC校验的基础算法,它不同于我们平常所学的十进制除法,因为在这个系统中,除数和被除数都是二进制数,并且遵循模二运算规则,即两个数相加如果结果超过1,则结果为结果对2取模。 CRC16校验指的是...
本篇文章将深入探讨如何实现大数的除法运算,这在密码学、分布式计算、科学计算等领域都有着广泛应用。 大数除法的核心是模拟传统的长除法过程,但我们需要将其扩展到可以处理任意长度的数字。这个过程涉及的主要...
这些函数可能包括整数除法函数(如`整数除法`)、浮点除法函数(如`浮点除法`)以及模除法函数(如`取模`)。通过分析源码,我们可以学习到如何在易语言中定义和调用这些函数,以及如何处理可能出现的除零错误。 在...
本主题将深入讲解如何使用Verilog实现除法操作,并结合FPGA进行仿真验证。 首先,让我们理解除法的基本原理。除法可以视为乘法的逆运算,通常通过连续的减法和移位来实现。在二进制系统中,这个过程与十进制系统...
通过以上步骤,我们可以实现C++中的大数除法,处理100位数的除法并保留100位小数。这不仅涉及到数据结构的设计,还包括了数值计算的精确性和效率问题。在实际编码时,还需要考虑代码的可读性和可维护性,确保算法的...
在C语言中,模拟式除法是一种用于...模拟式除法利用整数溢出来处理计算,而素数模乘同余法则通过乘法和减法实现随机数的生成。这两种方法都在处理数值计算时,巧妙地解决了可能的溢出问题,确保了计算的准确性和效率。
大数运算主要包括加法、减法、乘法、除法、乘方和取模等基本操作。这些操作在实现上需要特别考虑,因为它们不能直接通过内置的数据类型来处理。以下是对每个运算的详细说明: 1. **大数加法**:大数加法与小学数学...
在设计过程中,禁止直接使用Verilog中的除法和取模运算符,而是要利用恢复余数算法或加减交替算法来实现。 **原码除法原理**: 原码除法中,符号位是独立处理的。假设被除数为[x]原,除数为[y]原,它们的绝对值分别...
在嵌入式软件编程中,优化除法运算对于提高处理器效率至关重要,特别是在使用ARM架构的设备上,因为ARM硬件不直接支持除法指令。...在实际编程中,开发者应结合具体应用场景,灵活运用这些方法,实现高效的除法运算。
2. **排序与查找**:在计算数组中元素的相对位置或者确定特定元素出现的位置时,带余除法可以简化计算,如取模分桶、线性探测法解决哈希冲突等。 3. **动态规划**:在动态规划问题中,状态转移方程常常涉及带余除法...
大数运算处理的是超出普通整型数据类型范围的数值,通常涉及的运算包括加法、减法、乘法、除法、取模以及幂运算和模幂运算。在给定的"大数运算包含加,减,乘,除,取模,幂运算,模幂运算。支持十进制运算,二进制...
这可能涉及到C语言的算术运算符,如"/"表示除法,以及可能的取模运算符 "%",用于获取除法后的余数。同时,这个过程可能涉及到位操作,因为P1和P0口通常是按位进行操作的。 标签“资料”表明这是一个教学或者学习...
在这个实验中,我们主要学习了C语言的除法运算、浮点数处理、取模运算以及自定义四舍五入的方法。这些都是C语言基础的重要组成部分,对于理解和编写涉及数值计算的程序至关重要。通过这样的实践,可以加深对这些概念...
取模法构造散列函数时,通常是将输入数据经过某种计算(如除法、位操作等)后,用模运算限制其结果在0到(表大小-1)之间。这样,每个输入数据都将对应一个唯一的桶(bucket),数据存储在这个桶对应的数组位置上。...