`
len-len
  • 浏览: 22261 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

模拟手算加法,乘法

    博客分类:
  • java
阅读更多

前几天在逛论坛的时候,发现一个题目比较有意思,用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();
		}
	}
}


4
2
分享到:
评论
1 楼 yangnanenana 2012-03-27  
思维很缜密,考虑很周全,学习了!

相关推荐

    单片机移位实现乘法运算(汇编语言)

    不同的处理器架构可能采用不同的方式来执行乘法,有些处理器内置了专门的硬件乘法器来提高效率,而有些则需要通过软件算法来模拟这一过程。对于没有内置乘法器的处理器,如单片机,可以通过编程手段实现乘法功能。...

    长整数的乘法 基于C++编程

    长整数的乘法可以通过模拟手算乘法的方式来实现。具体步骤如下: 1. **初始化结果数组**:创建一个足够大的数组用于存放计算结果。 2. **逐位相乘**:对于两个长整数A和B的每一位进行相乘,并将结果累加到结果数组...

    大数处理问题(就是用字符串)

    大数的加法在`Add`函数中实现,使用类似于手算加法的方式,从低位到高位逐位相加,同时记录进位。如果某位相加大于9,则需要进位,将结果存储在下一位,并对当前位进行取模运算。 4. **大数减法**: 大数减法由`...

    算法-基础算法- 高精度计算- 高精度加法(包含源程序).rar

    高精度加法的核心在于模拟人类手算大数字加法的过程,即从低位到高位逐位相加,并考虑进位。在计算机中,我们通常使用字符串或数组来存储这些大整数,因为它们可以容纳任意长度的数字。以下是一个简化的高精度加法...

    计算机组成原理课程设计原码一位乘cop2000.zip.zip

    原码一位乘的基本思想是模拟手算乘法的过程,将每一位乘以另一个数的每一位,然后将结果相加。这个过程涉及到位移、与运算、加法等基本操作。例如,假设我们有二进制数101(5)和110(6),原码一位乘就是把5的每一...

    Win32下无符号大整数相乘优化算法及其C++实现

    赋值函数`operator=`将DWORD类型的整数转换为CBigNumber对象,而乘法操作`operator*=`则采用双重循环,模拟手算乘法的过程。每个DWORD位与乘数的每一位相乘,结果进行错位累加。在处理溢出时,会将高阶部分放到下一...

    大数的四则运算、加减乘除

    大数的加法可以通过模拟手工加法的方式来实现。从个位开始逐位相加,如果某一位超过9,则需要进位。在C++中,可以定义一个类`BigInt`,包含一个整数数组和数组长度。加法操作可以定义为成员函数`BigInt operator+...

    大数的处理

    大数加法可以通过模拟手算过程来实现。从个位开始逐位相加,如果某位的和超过9,则需要向高位进位。在编程中,我们可以使用两个指针分别遍历两个大数,进行逐位加法,并处理进位。例如,在Python中,可以直接使用...

    大整数运算库 大整数四则运算,加减乘除开平方

    1. **大整数加法**:大整数的加法可以通过模拟手算的方式实现,逐位相加并考虑进位。如果两个数的位数不同,需要在较短的数前面补零以保持对齐。加法过程中,当某一位的和超过单个位的存储限制时,需要向高位进位。 ...

    课设报告样例(大整数运算).rar

    大整数的加法和减法可以通过模拟手算过程实现。从低位到高位逐位进行运算,如果某一位相加大于9,则需要向高位进位或借位。需要注意的是,在处理进位或借位时,需要考虑到大整数的长度可能会变化。 四、大整数的...

    NumberClass

    Long Multiplication则类似手算乘法,对每一位进行逐个相乘然后求和。 5. **除法运算**: 除法是大数运算中最复杂的部分,可以使用Long Division算法,模拟手动除法的过程,不断迭代求解商和余数。也可以采用更...

    欧洲地区ACM试题(2000-2007)

    - 对于乘法,可以模拟手算的过程。即,从右向左遍历第二个数字的每一位,将其与第一个数字相乘得到部分积。 - 每个部分积的最右侧数字需要与第二个数字的相应位对齐。 - 将所有部分积相加以得到最终结果。 - ...

    C++ 超大数加减乘除幂计算

    加法可以采用类似小学生手算的方法,从低位到高位逐位相加,如果某位相加结果超过9,则向上一位进位。在C++中,这可以通过两个字符串或数组的对应位置相加并处理进位来实现。 3. **超大数的减法**: 减法操作与...

    高精度四种运算

    高精度乘法通过模拟手算乘法的过程来实现,主要包括以下步骤: 1. 将两个大数转换为数组存储。 2. 对齐两个数组的位数。 3. 逐位相乘并处理进位。 4. 计算结果同样以数组形式返回。 **示例代码解析:** ```c #...

    基于C++的大数计算程序

    在大数加法、减法、乘法或除法中,我们可以利用栈来存储中间结果,通过模拟手算过程,逐位进行运算。例如,在做加法时,我们可以将两个大数的位数对齐,然后从低位到高位逐位相加,若结果超过10,则需要向高位进位,...

    单片机乘除算法

    单片机中的乘除运算,尤其是除法运算,是通过对传统手算方法的模拟实现的。理解这一原理,不仅有助于程序员在各种单片机平台上实现这些基本运算,还能在此基础上进行扩展和优化,以适应不同的应用需求。掌握了这一...

    毕设论文基于大数运算的算术编码实现

    例如,大数乘法可以通过模拟手算乘法的过程来实现,即通过循环遍历每一位数字相乘后再相加。 #### 4. 基于大数运算的算术编码 ##### 4.1 理论基础 算术编码的核心在于如何高效地计算和维护区间范围。传统算术编码...

    基于字符串的高精度浮点计算实现

    字符串处理算法,如大数乘法、除法、加法和减法,可以使用类似于手算的方式进行,确保了每个位都被正确处理。例如,我们可以逐位比较、进位或借位,就像用纸笔进行长除法一样。 具体实现上,这种算法通常会包含以下...

    新老校区高三数学第二次联考试题 文(扫描版) 试题.doc

    9. **线性代数初步**:矩阵的基本概念,矩阵的加法、乘法和逆矩阵,线性方程组的解法等。 这份试卷的扫描版形式可能需要学生或教师手动输入题目进行解答,增加了对题目理解和手算能力的要求。同时,教师可以借此...

    Big-Numbers-Calculator-C-:简单的控制台计算器,可用于C ++中的大数字

    4. **除法算法**:大数除法较为复杂,可以使用长除法算法,模拟手算除法的过程。首先找出商的最高位,然后逐步计算后续位。这需要反复执行减法和判断余数的过程。 5. **内存管理**:由于大数可能非常大,内存管理是...

Global site tag (gtag.js) - Google Analytics