登 录
/** * 该算法实现了大数+、-、x,但是没有实现对负数的处理,因为处理负数可以通过判断大小去规避这个问题。另外除法没有实现 * * @author jie.xiang * */ public class BigNumberCounter { public BigNumberCounter() { } /** * 当大数位数不相等的时候,往前面添加0,使其位数一致 * * 对大数相减,不足即与前面借位。 * * @param beforNum * @param afterNum * @return * @author jie.xiang */ public String subNumbers(String beforNum, String afterNum) { int bLen = beforNum.length(); int aLen = afterNum.length(); int maxLength = Math.max(bLen, aLen); int distance = Math.abs(bLen - aLen); StringBuffer result = new StringBuffer(); if (bLen > aLen) { afterNum = getZeroNumbers(distance) + afterNum; } else { beforNum = getZeroNumbers(distance) + beforNum; } int carry = 0; for (int i = maxLength - 1; i >= 0; i--) { int a = Integer.parseInt(beforNum.charAt(i) + "") - carry; int b = Integer.parseInt(afterNum.charAt(i) + ""); carry = 0; if (a < b) { a += 10; carry = 1; if (i == 0) { result.append("-"); } } result.append(String.valueOf(a - b)); } return result.reverse().toString(); } /** * 当大数位数不相等的时候,往前面添加0,使其位数一致 * * 相加的值,与10产生的余数为结果,除以十位进位的内容。 * * @param beforNum * @param afterNum * @return * @author jie.xiang */ public String addNumbers(String beforNum, String afterNum) { int bLen = beforNum.length(); int aLen = afterNum.length(); int maxLength = Math.max(bLen, aLen); int distance = Math.abs(bLen - aLen); StringBuffer result = new StringBuffer(); if (bLen > aLen) { afterNum = getZeroNumbers(distance) + afterNum; } else { beforNum = getZeroNumbers(distance) + beforNum; } int tempValue = 0; int carry = 0; for (int i = maxLength - 1; i >= 0; i--) { int a = Integer.parseInt(beforNum.charAt(i) + ""); int b = Integer.parseInt(afterNum.charAt(i) + ""); tempValue = a + b + carry; result.append(tempValue % 10); carry = tempValue / 10; } if (carry > 0) { result.append(carry); } return result.reverse().toString(); } private String getCharNumbers(int length, String ch) { StringBuffer result = new StringBuffer(); for (int i = 0; i < length; i++) { result.append(ch); } return result.toString(); } private String getZeroNumbers(int length) { return getCharNumbers(length, "0"); } /** * 大数相乘,逐位相乘,每个值与10产生的余数为结果,除以十位进位的内容,每次的值与前一位相乘的值相乘 * * @param beforNum * @param afterNum * @return * @author jie.xiang */ public String mutiNumbers(String beforNum, String afterNum) { int bLen = beforNum.length(); int aLen = afterNum.length(); int tempValue = 0; int carry = 0; String aNumber = "0"; for (int i = aLen - 1; i >= 0; i--) { int a = Integer.parseInt(afterNum.charAt(i) + ""); StringBuffer sb = new StringBuffer(); String bNumber = "0"; carry = 0; if (a == 0) { continue; } for (int j = bLen - 1; j >= 0; j--) { int b = Integer.parseInt(beforNum.charAt(j) + ""); tempValue = a * b + carry; sb.append(tempValue % 10); carry = tempValue / 10; } if (carry > 0) { sb.append(carry); } bNumber = sb.reverse().toString() + getZeroNumbers(aLen - i - 1); bNumber = addNumbers(aNumber, bNumber); aNumber = bNumber; } return aNumber; } /** * 过滤结果,去除多余的0 * * @param values * @return */ private String getNoPrefixZero(String values) { String result = ""; int i = 0; char zero = '0'; for (; i < values.length(); i++) { if (values.charAt(i) != zero) { break; } } result += values.substring(i); if (result.length() == 0) { result = "0"; } return result; } /** * @param args */ public static void main(String[] args) { BigNumberCounter counter = new BigNumberCounter(); System.out.println(counter.addNumbers( "99999999999999999999999999999999999999999999", "1")); System.out.println(counter.mutiNumbers("9999999999999999999999999", "9999999999999999999999999999999")); String value = counter.subNumbers( "25411111111111111111111111111111111111111136", "343453534546546757676856"); System.out.println(counter.getNoPrefixZero(value)); } }
这几天突然被算法题难住了,确实忘记了哦,好久没做了,现在有时间自己再写写这些基本问题,基础不能忘啊,呵呵
抱歉!评论已关闭.