关于两个任意长度的数字相乘的代码设计(不使用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; } }
相关文章推荐
- 任意长度的两个正整数相乘
- windows phone关于电池使用情况的获取代码
- 如果系统要使用超大整数(超过long长度范围),请你设计一个数据结构来存储这种超大型数字以及设计一种算法来实现超大整数加法运算)
- 第16周项目5-编程处理C++代码(输入m、n两个数字,从第m行起的n行代码将作为注释使用)
- 两个任意长度的长整数相乘(C语言、双向链表方法)
- 关于使用merge合并两个data_frame出现大量的空值的情况
- 使用javascript比较任意两个日期相差天数(代码)
- 设计算法并写出代码移除字符串中重复的字符,不能使用额外的缓存空间。注意: 可以使用额外的一个或两个变量,但不允许额外再开一个数组拷贝。
- 使用正则表达式将任意长度的浮点数字的字符串转换成百分数
- 求两个大整数相乘的积,数字长度在127个字符之内。
- 关于求两个数字序列最打子序列长度的一道程序题
- (大数乘法)两个至多长度为100的数字相乘
- JS判断输入字符串长度实例代码(汉字算两个字符,字母数字算一个)
- 使用c语言编写程序,从键盘上任意输入两个数字,并计算出两个数的最小公倍数
- 英雄会-----任意长度的两个正整数相乘
- JavaScript使用Max函数返回两个数字中较大数的代码
- 两个任意长度的长整数相乘(华为oj,C++)
- 任意长度的两个正整数相乘
- 关于不使用第三方数字交换两个数字的实现
- 编程实现任意长度的两个正整数相加 代码实现