前几天在逛论坛的时候,发现一个题目比较有意思,用java实现手算相加,相乘,觉得有意思就写了写。把代码贴上了,大家拍砖。
package string;
import java.math.BigInteger;
public class Add {
/**
* 模拟手算加法
**/
public static String add(String a ,String b){
//最后的结果放入到这个字符串中
StringBuilder result = new StringBuilder("");
try {
String newA = deleteZeroStrng(a);
String newB = deleteZeroStrng(b);
char[] maxChar = newA.length()>=newB.length()?newA.toCharArray():newB.toCharArray();
char[] minChar = newA.length()<newB.length()?newA.toCharArray():newB.toCharArray();;
//求2个数的最大长度和最小长度
int maxLen = maxChar.length;
int minLen = minChar.length;
//进位
int carry = 0;
//最小的长度为循环次数,就是加数
for (int i = 0; i < minLen; i++) {
int sum = maxChar[i]-'0'+minChar[i]-'0'+carry;
result.append(sum%10);
carry = sum/10;
}
//如果位数相等,补一位1
if(minLen==maxLen){
if(carry==1)
result.append(1);
}
//复制多余的位数
else{
for (int i = minLen; i < maxLen; i++) {
int value = maxChar[i]-'0'+carry;
result.append(value%10);
carry = value/10;
}
if(carry!=0){
result.append(carry);
}
}
} catch (Exception e) {
e.printStackTrace();
}
return result.reverse().toString();
}
/**
* 模拟手算乘法
*/
public static String multiply(String a,String b){
String resultString = "";
try {
char[] charA = deleteZeroStrng(a).toCharArray();
char[] charB = deleteZeroStrng(b).toCharArray();
int charALength = charA.length;
int charBLength = charB.length;
//进位
int carry = 0;
//相乘得到的是N个数,然后求和
String[] result = new String[charBLength];
//二次循环
for (int i = 0; i<charBLength; i++) {
int valueB = charB[i]-'0';
StringBuilder tempStr = new StringBuilder("");
for (int j = 0; j<charALength; j++) {
int valueA = charA[j]-'0';
int temp = valueB*valueA+carry;
tempStr.append(temp%10);
carry = temp/10;
}
if(carry!=0){
tempStr.append(carry);
}
result[i]=tempStr.reverse().toString();
for(int k=0;k<i;k++){
result[i]+="0";
}
carry = 0;
}
resultString = result[0];
for (int i=1;i<result.length;i++) {
resultString=add(resultString, result[i]);
}
} catch (Exception e) {
System.out.println("至少有一个字符串不属于数字!");
}
return resultString;
}
/**
* 利用乘法
* 模拟阶乘
*/
public static String factorial(Long n){
String str = "1";
for (int i = 2; i <= n; i++) {
str = multiply(str.toString(),String.valueOf(i));
}
return str;
}
/**
* 清除以0,00等开头的字符串,逆序排列
*/
public static String deleteZeroStrng(String s) throws Exception{
if(s.matches("[0]+")){
return "0";
}
else if(s.matches("\\d+")){
StringBuilder builder = new StringBuilder("");
if(s.matches("^[0]+")){
builder.append(s.split("^[0]+")[1].trim());
}else{
builder.append(s.trim());
}
return builder.reverse().toString();
}else{
throw new Exception();
}
}
public static void main(String[] args) {
try {
String a = "1345435435234792334534534543543";
String b = "1803454350435345543543543454354";
BigInteger bigA = new BigInteger(a);
BigInteger bigB = new BigInteger(b);
System.out.println(a+" + "+b+" = "+add(a, b));
System.out.println(a+" X "+b+" = "+multiply(a, b));
System.out.println("java自带的类:"+bigA.add(bigB));
System.out.println("java自带的类:"+bigA.multiply(bigB));
long n = 94;
System.out.println("!"+n+" = "+factorial(n));
BigInteger result = new BigInteger("1");
for (int i = 2; i <= n; i++) {
BigInteger add = new BigInteger(String.valueOf(i));
result = result.multiply(add);
}
System.out.println("!"+n+" = "+result);
} catch (Exception e) {
e.printStackTrace();
}
}
}
分享到:
相关推荐
不同的处理器架构可能采用不同的方式来执行乘法,有些处理器内置了专门的硬件乘法器来提高效率,而有些则需要通过软件算法来模拟这一过程。对于没有内置乘法器的处理器,如单片机,可以通过编程手段实现乘法功能。...
长整数的乘法可以通过模拟手算乘法的方式来实现。具体步骤如下: 1. **初始化结果数组**:创建一个足够大的数组用于存放计算结果。 2. **逐位相乘**:对于两个长整数A和B的每一位进行相乘,并将结果累加到结果数组...
大数的加法在`Add`函数中实现,使用类似于手算加法的方式,从低位到高位逐位相加,同时记录进位。如果某位相加大于9,则需要进位,将结果存储在下一位,并对当前位进行取模运算。 4. **大数减法**: 大数减法由`...
高精度加法的核心在于模拟人类手算大数字加法的过程,即从低位到高位逐位相加,并考虑进位。在计算机中,我们通常使用字符串或数组来存储这些大整数,因为它们可以容纳任意长度的数字。以下是一个简化的高精度加法...
原码一位乘的基本思想是模拟手算乘法的过程,将每一位乘以另一个数的每一位,然后将结果相加。这个过程涉及到位移、与运算、加法等基本操作。例如,假设我们有二进制数101(5)和110(6),原码一位乘就是把5的每一...
赋值函数`operator=`将DWORD类型的整数转换为CBigNumber对象,而乘法操作`operator*=`则采用双重循环,模拟手算乘法的过程。每个DWORD位与乘数的每一位相乘,结果进行错位累加。在处理溢出时,会将高阶部分放到下一...
大数的加法可以通过模拟手工加法的方式来实现。从个位开始逐位相加,如果某一位超过9,则需要进位。在C++中,可以定义一个类`BigInt`,包含一个整数数组和数组长度。加法操作可以定义为成员函数`BigInt operator+...
大数加法可以通过模拟手算过程来实现。从个位开始逐位相加,如果某位的和超过9,则需要向高位进位。在编程中,我们可以使用两个指针分别遍历两个大数,进行逐位加法,并处理进位。例如,在Python中,可以直接使用...
1. **大整数加法**:大整数的加法可以通过模拟手算的方式实现,逐位相加并考虑进位。如果两个数的位数不同,需要在较短的数前面补零以保持对齐。加法过程中,当某一位的和超过单个位的存储限制时,需要向高位进位。 ...
大整数的加法和减法可以通过模拟手算过程实现。从低位到高位逐位进行运算,如果某一位相加大于9,则需要向高位进位或借位。需要注意的是,在处理进位或借位时,需要考虑到大整数的长度可能会变化。 四、大整数的...
Long Multiplication则类似手算乘法,对每一位进行逐个相乘然后求和。 5. **除法运算**: 除法是大数运算中最复杂的部分,可以使用Long Division算法,模拟手动除法的过程,不断迭代求解商和余数。也可以采用更...
- 对于乘法,可以模拟手算的过程。即,从右向左遍历第二个数字的每一位,将其与第一个数字相乘得到部分积。 - 每个部分积的最右侧数字需要与第二个数字的相应位对齐。 - 将所有部分积相加以得到最终结果。 - ...
加法可以采用类似小学生手算的方法,从低位到高位逐位相加,如果某位相加结果超过9,则向上一位进位。在C++中,这可以通过两个字符串或数组的对应位置相加并处理进位来实现。 3. **超大数的减法**: 减法操作与...
高精度乘法通过模拟手算乘法的过程来实现,主要包括以下步骤: 1. 将两个大数转换为数组存储。 2. 对齐两个数组的位数。 3. 逐位相乘并处理进位。 4. 计算结果同样以数组形式返回。 **示例代码解析:** ```c #...
在大数加法、减法、乘法或除法中,我们可以利用栈来存储中间结果,通过模拟手算过程,逐位进行运算。例如,在做加法时,我们可以将两个大数的位数对齐,然后从低位到高位逐位相加,若结果超过10,则需要向高位进位,...
单片机中的乘除运算,尤其是除法运算,是通过对传统手算方法的模拟实现的。理解这一原理,不仅有助于程序员在各种单片机平台上实现这些基本运算,还能在此基础上进行扩展和优化,以适应不同的应用需求。掌握了这一...
例如,大数乘法可以通过模拟手算乘法的过程来实现,即通过循环遍历每一位数字相乘后再相加。 #### 4. 基于大数运算的算术编码 ##### 4.1 理论基础 算术编码的核心在于如何高效地计算和维护区间范围。传统算术编码...
字符串处理算法,如大数乘法、除法、加法和减法,可以使用类似于手算的方式进行,确保了每个位都被正确处理。例如,我们可以逐位比较、进位或借位,就像用纸笔进行长除法一样。 具体实现上,这种算法通常会包含以下...
9. **线性代数初步**:矩阵的基本概念,矩阵的加法、乘法和逆矩阵,线性方程组的解法等。 这份试卷的扫描版形式可能需要学生或教师手动输入题目进行解答,增加了对题目理解和手算能力的要求。同时,教师可以借此...
4. **除法算法**:大数除法较为复杂,可以使用长除法算法,模拟手算除法的过程。首先找出商的最高位,然后逐步计算后续位。这需要反复执行减法和判断余数的过程。 5. **内存管理**:由于大数可能非常大,内存管理是...