大数算法 -- 正整数相乘(Java 实现)
发布时间:2020-12-14 03:51:54 所属栏目:大数据 来源:网络整理
导读:程序流程图(活动图): 算法实现: public class NumberCalculator{public NumberCalculator(){}/** * 字符串表示大数相乘 * @param firStr -- 第一个大数 * @param secStr -- 第二个大数 * @return 结果字符串 */public String getMulNumStr(String firStr,S
程序流程图(活动图): 算法实现: public class NumberCalculator { public NumberCalculator() { } /** * 字符串表示大数相乘 * @param firStr -- 第一个大数 * @param secStr -- 第二个大数 * @return 结果字符串 */ public String getMulNumStr(String firStr,String secStr) { String resStr=""; int firLength=firStr.length(); int secLength=secStr.length(); //声明数组 int[] firNum=new int[firLength]; int[] secNum=new int[secLength]; int[] resNum=null; //字符串转换整形数组. for ( int firIndex=0;firIndex<firLength;firIndex++) { firNum[firIndex]=firStr.charAt(firIndex)-48; } for(int secIndex=0;secIndex<secLength;secIndex++) { secNum[secIndex]=secStr.charAt(secIndex)-48; } //获得结果. if(firLength>secLength) { resNum=getMulNumInt(firNum,secNum); } else { resNum=getMulNumInt(secNum,firNum); } //结果优化. for ( int resIndex=1;resIndex<resNum.length;resIndex++) { resStr+=resNum[resIndex]; } if(resNum[0]!=0) { resStr=resNum[0]+resStr; } //返回结果 return resStr; } /** * 正整数大数相乘 * @param firNum -- 第一个大数 * @param secNum -- 第二个大数 * @return -- 结果数组 */ private int[] getMulNumInt(int[] firNum,int[] secNum) { int[] resNum=new int[firNum.length+secNum.length]; int[] midNum=new int[firNum.length+1]; for(int secIndex=secNum.length-1;secIndex>=0;secIndex--) { midNum=getMidNum(firNum,secNum[secIndex]); resNum=getResNum(resNum,midNum,secNum.length-secIndex-1); } return resNum; } /** * 结果加中间结果 * @param resNum -- 结果 * @param midNum -- 一个中间结果 * @param shift -- 偏移位数 * @return -- 结果数组 */ private int[] getResNum(int[] resNum,int[] midNum,int shift) { //进位标志 int carry=0; int midLen=midNum.length; int midRes=0; int resLen=resNum.length; //应该操作结果的操作位 int opeBit=resLen-1-shift; for(int index=midLen-1;index>=0;index--) { midRes=resNum[opeBit]+midNum[index]+carry; carry=midRes/10; resNum[opeBit]=midRes%10; opeBit--; } while(carry!=0) { midRes=resNum[opeBit]+carry; resNum[opeBit]=midRes%10; carry=midRes/10; opeBit--; } return resNum; } /** * 获得一个大数乘一个个位数的结果 * @param firNum -- 大数 * @param number -- 个位数 * @return 结果数组 */ private int[] getMidNum(int[] firNum,int number) { int length=firNum.length; int[] resNum=new int[length+1]; int carry=0; int midRes=0; int shift=resNum.length-1; for(int index=length-1;index>=0;index--) { midRes=firNum[index]*number+carry; resNum[shift]=midRes%10; carry=midRes/10; shift--; } resNum[shift]=carry; return resNum; } } 程序调用: System.out.println("-------------------begin test number----------------------------"); String resNum=new NumberCalculator().getMulNumStr("999999999999999","9999999999999999"); System.out.println("The result is : "+resNum); System.out.println("-------------------end test number----------------------------");
-------------------begin test number---------------------------- The result is : 9999999999999989000000000000001 -------------------end test number---------------------------- (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |