Java 大数加减乘(无除),不含小数点
2015-12-23 09:28
483 查看
package com.algorithm; public class BigIntegerOpeator { public static void main(String[] args) { String a = "1231313432"; String b = "12312376"; String result = add(a, b); System.out.println(a + " + " + b + " = " + result); String c = "1234"; String d = "5678"; System.out.println(c + " - " + d + " = " + sub(c, d)); String e = "1234"; String f = "1"; System.out.println(e + " * " + f + " = " + multi(e, f)); } private static String multi(String e, String f) { return multi(e.toCharArray(), f.toCharArray()); } /** * @Author:yangwl * @date 2015年12月22日 下午4:15:36 * @param charArray * @param charArray2 * @return * @throws * @Description: //大整数相乘 * //简单乘法+大整数加法 */ private static String multi(char[] a, char[] b) { int b_index = b.length; char [] result = new char[a.length + b.length + 1]; int index = result.length; init(result); //首先初始化result数组 char [] t = subMulti(a, b[--b_index]); for(int i = t.length-1; i >= 0; i--) { result[--index] = t[i]; } index = result.length; int f = 1; while(--b_index >= 0) { char [] t1 = clearZero(result); char [] t2 = subMulti(a, b[b_index]); t2 = (new String(t2) + getZero(f)).toCharArray(); if(null == t1) { t1 = result; } char[] t3 = add(t1, t2).toCharArray(); int l = result.length; for(int i = t3.length-1; i >= 0; i--) { result[--l] = t3[i]; } f++; } replace(result); return new String(result).replace("_",""); } private static void replace(char[] result) { for(int i = 0; i < result.length; i++) { if(result[i] == '0') { result[i] = '_'; } else { break; } } } private static String getZero(int f) { String s=""; for(int i = 0; i < f; i++) { s += "0"; } return s; } private static char[] clearZero(char[] result) { for(int i = 0; i < result.length; i++) { if(result[i] != '0') { return new String(result, i, result.length - i).toCharArray(); } } return null; } private static char[] subMulti(char[] a, char c) { char [] result = new char[a.length+1]; init(result); int index = result.length; int a_index = a.length; while(--a_index >= 0 && --index >= 0) { int r = parseToInt(a[a_index]) * parseToInt(c); result[index] = parseToChar(parseToInt(result[index]) + r % 10); if(r >= 10) { result[index-1] = parseToChar(parseToInt(result[index-1]) + r / 10); } } return (result[0] == '0' ? new String(result,1,result.length-1) : new String(result)).toCharArray(); } /*********************************************************************************************************************************************************************/ private static String sub(String a, String b) { return sub(a.toCharArray(), b.toCharArray()); } /** * @Author:yangwl * @date 2015年12月22日 下午1:10:11 * @param charArray * @param charArray2 * @return * @throws * @Description: //两个数做减法 */ private static String sub(char[] a, char[] b) { int index = 0; boolean flag = true; if (a.length > b.length){ index = a.length; } if (b.length > a.length) { index = b.length; flag = false; } if (a.length == b.length) { index = a.length; for(int i = 0; i < index; i++) { if(parseToInt(a[i]) > parseToInt(b[i])) { break; } if(parseToInt(b[i]) > parseToInt(a[i])) { flag = false; break; } if(parseToInt(b[i]) == parseToInt(a[i])) { if(i+1 == index) return parseToChar(0)+""; continue; } } } char [] result; if(!flag) { result = a; a = b; b = result; } result = new char[index]; int a_index = a.length-1; int b_index = b.length-1; index--; while(index != -1) { int a_value = 10; if(a_index > -1) { a_value = parseToInt(a[a_index]);; } int sub = a_value; if(b_index > -1) { if(10 == sub) { System.out.println("执行出错."); return ""; }; int b_value = parseToInt(b[b_index--]); if(a_value >= b_value) { sub = a_value - b_value; } else { //首先借1 a[a_index-1] = parseToChar(parseToInt(a[a_index-1]) - 1 + 48); sub = a_value + 10 - b_value; } } a_index --; result[index--] = parseToChar(sub); } if(result[0] == '0') { if(flag) { return new String(result,1,result.length-1); } else { result[0] = '-'; return new String(result); } } else { if(flag) { return new String(result); } else { return "-"+new String(result); } } } private static String add(String a, String b) { return add(a.toCharArray(), b.toCharArray()); } /** * @Author:yangwl * @date 2015年12月21日 下午2:20:08 * @param a * @param b * @return * @throws * @Description: //TODO */ private static String add(char[] a, char[] b) { int index = a.length > b.length ? a.length + 1 : b.length + 1; char [] result = new char[index]; init(result); int a_index = a.length; int b_index = b.length; int i = 0; while(i < index) { int temp = 0; if(--a_index >= 0) { temp = (int)a[a_index] - 48; } if(--b_index >= 0) { temp += (int)b[b_index] - 48; } result[--index] =(char) ((int)(result[index]-48) + temp % 10 + 48); if(temp / 10 == 1) { result[index - 1] = '1'; } } return result[0] == '1' ? new String(result) : new String(result,1,result.length-1); } private static void init(char[] result) { for(int i = 0; i < result.length; i++) { result[i] = '0'; } } public static int parseToInt(char c) { return (int)c - 48; } public static char parseToChar(int a) { return (char)(a + 48); } }
相关文章推荐
- ionic js与Java互操作插件
- Java基础教程之构造器与方法重载
- Java开源框架、类库和软件集合:Awesome Java
- JavaEE应用的组件
- Java基础教程之对象的方法与数据成员
- JAVA学习第五十七课 — IO流(十一)
- Java并发编程:Callable、Future和FutureTask
- Java WebService 简单实例
- eclipse启动svn报错Failed to load JavaHL Library解决办法
- 如何设置eclipse格式化代码时不自动换行
- 40个Java多线程问题总结
- Java基本数据类型总结
- java 中时间的有关问题
- 详解Java的Hibernate框架中的缓存与原生SQL语句的使用
- javaEE web开发中文乱码分析
- Spring 4 学习笔记2:控制反转(IoC)和依赖注入(DI)
- (1)java基本了解
- eclipse不自动弹出提示(alt+/快捷键失效)
- [javase学习笔记]-7.2 构造函数与一般函数的区别
- eclipse 安装SVN,MAVEN简洁方式