关于两个任意长度的数字相乘的代码设计(不使用BigDecimal的情况下)

来源:互联网 发布:日本社交软件 编辑:程序博客网 时间:2024/05/22 17:37
package bigNumOfMulti;import java.util.ArrayList;import java.util.HashMap;import java.util.Iterator;import java.util.List;import java.util.Map;public class MultiBigNum {public static void main(String[] args) throws Exception {MultiBigNum multiBigNum = new MultiBigNum();String aaa ="9643";String bbb= "324";Map<String, List<String>> map1 = multiBigNum.multiRequest(aaa,bbb);for (int i = 0; i < map1.size(); i++) {List<char[]> listResult =  multiBigNum.dislocationAddition(map1.get("list"+i));int ccccccc =1;}}//1.获取每一轮 每次两两相乘的集合/*** 举例子*/public Map<String, List<String>> multiRequest(String numA,String numB) throws Exception{//固定乘数被乘数的位置,保证循环的次数最少if (numA.length()<numB.length()) {String c = numA;numA =numB;numB =c; }//根据numB的length来创建集合用于存储数据Map<String, List<String>> map = creatListbyNumB(numB);char [] arrayOfNumA =numA.toCharArray();char [] arrayOfNumB =numB.toCharArray();for (int i = arrayOfNumB.length-1 ; i >=0; i--) {for (int j = arrayOfNumA.length-1; j >=0; j--) {//(int)arrayOfNumA[j])   强转不可行 错误!!!int a =Integer.parseInt(arrayOfNumA[j]+"");int b = Integer.parseInt(arrayOfNumB[i]+"");String  requestOfTwoNum =a*b+"";if(requestOfTwoNum.length()<2){requestOfTwoNum ="0"+requestOfTwoNum;}map.get("list"+(arrayOfNumB.length-i-1)).add(requestOfTwoNum);}}return map;}//工具————根据numB的长度来创建list集合public Map<String,List<String>> creatListbyNumB(String numB) throws Exception{int length = numB.length();Map<String, List<String>> map = null;if (length >0) {map = new HashMap<String, List<String>>();for (int i = 0; i < length; i++) {map.put("list"+i, new ArrayList<String>());}}if (map ==null) {throw new Exception("很明显numB没值");}return map;}/*** 错位大法* 例如:* listReq :[12,16,24,36]*        0  0  0  1  2*        0  0  1  6  0*        0  2  4  0  0*        3  6  0  0  0*        3  8  5  7  2  *所以先处理集合为:[00012,00160,02400,36000]*                  * @return*/public List<char []>  dislocationAddition(List<String> listReq){//1.获取集合的size然后减一,(实际为补0的个数)int addZeroNum  =  listReq.size()-1;//2.创建一个用于接收结果的listList<char []> result = new ArrayList<char []>();//3.遍历集合拿出元素做处理StringBuffer sb =  new StringBuffer();for (int i = 0; i < listReq.size(); i++) {//然后将每个"0"放入数组当中List<String> baseList = new ArrayList<String>();for (int j = 0; j < addZeroNum; j++) {baseList.add("0"); //例如:[0,0,0]}//取出第i位元素String strIII  = listReq.get(i);//将第i为元素插入[0,0,0]中,具体位置取决于i的值baseList.add(baseList.size()-i,strIII);//例如:[0,0,0,12]for (int j = 0; j < baseList.size(); j++) {sb.append(baseList.get(j));}char [] resChar  =   sb.toString().toCharArray();result.add(resChar);sb.setLength(0);//或者 sb.delete(0, sb.length());}return result;}public  char[] bitByBitAddition(List<char[]> listReq){for (int i = 0; i < listReq.size(); i++) {char [] c = listReq.get(i);//每列之和int bitNum = 0 ;//进位值int addBit = 0 ;//存放结果的数组for (int j = 0; j < c.length; j++) {bitNum+=Integer.parseInt(c[j]+"")+addBit;if (bitNum > 9) {addBit = (bitNum-(bitNum%10))/10;bitNum = bitNum%10;}}}return null;}/*** 一个没用的方法,懒得删了* @param a* @param b* @return*/public int[] mutifyOfTwoNum(int a ,int b){int g = (a*b)%10;int s = (a*b)/10%10;int [] c = {g,s};return c;}}

 
原创粉丝点击