您的位置:首页 > 编程语言

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

2017-11-28 20:07 423 查看
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.创建一个用于接收结果的list
List<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;

}

}


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  设计 创新
相关文章推荐