大数的加法,减法,乘法
发布时间:2020-12-14 02:00:51 所属栏目:大数据 来源:网络整理
导读:最近在研究算法,其中用到了大数的乘法,于是便对以前写过的大数的加法和减法,放在一起做了各总结,写了个BigData类 如有不完善的地方还请指正。 代码如下: package com.zjianhao.main;public class BigData {/** * 大数加法 * @param str1 加数 * @param
最近在研究算法,其中用到了大数的乘法,于是便对以前写过的大数的加法和减法,放在一起做了各总结,写了个BigData类 如有不完善的地方还请指正。 代码如下: package com.zjianhao.main; public class BigData { /** * 大数加法 * @param str1 加数 * @param str2 加数 * @return 和 */ public static String add(String str1,String str2){ int len1 = str1.length(); int len2 = str2.length(); int maxLength = len1>len2? len1:len2; int minLength = len1<len2? len1:len2; int size = maxLength - minLength; if (size>0&&len1>len2){ for (int i=0; i<size; i++) str2 = "0"+str2;//位数不够前面补零,使两个字符串一样长,便于处理 }else if (size>0&&len1<len2){ for (int i=0; i<size; i++) str1 = "0"+str1;//位数不够前面补零,使两个字符串一样长,便于处理 } int[] result = new int[maxLength+1]; for (int i=0,j=maxLength-1; i<maxLength; i++,j--){ result[j+1] += (str1.charAt(j)-'0')+(str2.charAt(j)-'0'); if (result[j+1]>=10){ result[j] = result[j+1]/10; result[j+1] = result[j+1]%10; } } return removeFrontZero(result); } /** * 被减数大于减数 * @param str1 被减数 * @param str2 减数 * @return 差 */ public static String subtra(String str1,String str2){ int len1 = str1.length(); int len2 = str2.length(); int maxLength = len1>len2? len1:len2; int minLength = len1<len2? len1:len2; int[] result = new int[maxLength]; int size = maxLength - minLength; for (int i=0; i<size; i++) str2 = "0"+str2;//位数不够前面补零,使两个字符串一样长,便于处理 for (int i=0,k=maxLength -1,m=len1-1; i<maxLength; i++,k--,m--){ int num1= str1.charAt(m) - '0'; int num2 = str2.charAt(m)- '0'; if (num1 > num2) result[k] += num1 - num2; else { result[k] += num1+10 - num2; result[k-1] -= 1;//向前一位借一 } } return removeFrontZero(result); } /** * 带正负号的大整数减法,被减数和减数无大小限制 * @param str1 被减数 * @param str2 减数 * @return 差,被减数大于减数返回正数,被减数小于减数返回负数 */ public static String subtraction(String str1,String str2){ int len1 = str1.length(); int len2 = str2.length(); if (len1 > len2) return subtra(str1,str2); else if (len1 == len2){ for (int i=0; i<len1; i++){ int num = (str1.charAt(i) - '0') - (str1.charAt(i) - '0'); if (num >0) return subtra(str1,str2); else if (num < 0) return '-'+subtra(str2,str1); else continue; } return "0"; }else return '-'+subtra(str2,str1); } /** * 大整数乘法 * @param str1 乘数 * @param str2 乘数 * @return 积 */ public static String multiplication(String str1,String str2){ int len1 = str1.length(); int len2 = str2.length(); int [] result = new int[len1+len2]; for (int i=len1-1,pos=len1+len2-1; i>=0; i--,pos--) for (int j=len2-1,k=pos; j>=0; j--,k--){ result[k] += (str1.charAt(i)-'0')*(str2.charAt(j)-'0'); if (result[k] >= 10){ result[k-1] += result[k]/10; result[k] = result[k]%10; } } return removeFrontZero(result); } /** * 将数字前面的零去掉(数字不能以零开头) * @param result * @return */ public static String removeFrontZero(int [] result){ //去除前边的零 StringBuilder builder = new StringBuilder(); int i; for (i=0; i<result.length; i++) if (result[i]!=0) break; for (int j=i; j<result.length; j++) builder.append(result[j]); return builder.toString(); } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |