`
len-len
  • 浏览: 21948 次
  • 性别: 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  
思维很缜密,考虑很周全,学习了!

相关推荐

Global site tag (gtag.js) - Google Analytics