计算两个用字符串表示的数字的乘积(包括不带小数位与带小数位情形)
如题,如何计算两个用字符串表示的数字的乘积(包括不带小数位与带小数位情形)呢?对于两个整形数字的乘积还好,若两个数字中包含小数,计算就稍微复杂一些了。
计算两个整形的乘积的过程:先把两个数字的各位保存在int数组或char数组中,然后再申请一个有该两个数组长度和的数组保存各位相乘的结果,同时还要注意合并两个数字参与计算的数组下标和相同的乘积,例如,前一个数字保存在int[] num1,从i=num1.length-1开始循环,后一个保存在int[] num2中,从j=num2.length-1开始循环,保存乘积的数组为int[] temp,在计算中,实际上是存在下标是i+j 的计算结果需要合并到temp[i+j]中的,最后就是对temp中各位的转换,大于10的作进位处理。
对于包含小数的情形,需要先判断小数位,计算结果在适当的位置添上小数位即可。
具体的实现代码如下(Java版):
1 import java.util.Scanner; 2 3 /** 4 * 计算两个用字符串表示的数字的乘积(包括不带小数位与带小数位情形) 5 * @author JiaJoa 6 * 7 */ 8 9 public class Main { 10 11 public static void main(String[] args) { 12 Scanner in = new Scanner(System.in); 13 String[] cc = in.nextLine().split("\\s"); 14 in.close(); 15 getStringNum(cc); 16 } 17 18 public static void getStringNum(String[] data){ 19 String rr = result(data); 20 System.out.println(rr); 21 } 22 23 //计算用字符串表示的两个数(已保存在数组中)的乘积 24 public static String result(String[] data){ 25 int flag1=0; //保存第一个乘数包含小数的位数(如果有小数位的话) 26 int flag2=0;//保存第二个乘数包含小数的位数(如果有小数位的话) 27 String str1 =null; //保存第一个乘数包含小数点的数字(如果有小数位的话) 28 String str2 = null; //保存第二个乘数包含小数点的数字(如果有小数位的话) 29 30 if(data[0].contains(".")){ 31 StringBuilder sb = new StringBuilder(); 32 int len1 = data[0].length(); 33 flag1 = len1-data[0].indexOf(".")-1; 34 for(int i=0;i<len1;i++){ 35 if(data[0].charAt(i)!='.'){ 36 sb.append(data[0].charAt(i)); 37 } 38 39 } 40 str1 = sb.toString(); 41 }else{ 42 str1 = data[0]; 43 } 44 45 if(data[1].contains(".")){ 46 StringBuilder sb = new StringBuilder(); 47 int len2 = data[1].length(); 48 flag2 = len2-data[1].indexOf(".")-1; 49 for(int i=0;i<len2;i++){ 50 if(data[1].charAt(i)!='.'){ 51 sb.append(data[1].charAt(i)); 52 } 53 54 } 55 str2 = sb.toString(); 56 }else{ 57 str2 = data[1]; 58 } 59 60 //模拟两个数各位相乘的过程 61 char[] num1 = str1.toCharArray(); 62 char[] num2 = str2.toCharArray(); 63 int[] temp = new int[num1.length+num2.length-1]; 64 for(int i=num1.length-1;i>=0;i--){ 65 for(int j=num2.length-1;j>=0;j--){ 66 int cj = Integer.parseInt(String.valueOf(num1[i]))* 67 Integer.parseInt(String.valueOf(num2[j])); 68 69 temp[i+j] += cj; 70 } 71 } 72 73 //计算结果进位转换 74 for(int i=temp.length-1;i>0;i--){ 75 temp[i-1] += temp[i]/10; 76 temp[i] = temp[i]%10; 77 } 78 79 int flag = flag1+flag2; ////保存两个乘数共包含小数的位数(如果有小数位的话) 80 81 StringBuilder build = new StringBuilder(); 82 for(int i=0;i<temp.length;i++){ 83 if(i==temp.length-flag){ 84 build.append("."); 85 } 86 build.append(temp[i]); 87 } 88 89 String result = build.toString(); 90 if(result.charAt(0)=='0'){ 91 result = result.substring(1); 92 } 93 return result; 94 } 95 }