计算两个用字符串表示的数字的乘积(包括不带小数位与带小数位情形)

如题,如何计算两个用字符串表示的数字的乘积(包括不带小数位与带小数位情形)呢?对于两个整形数字的乘积还好,若两个数字中包含小数,计算就稍微复杂一些了。

计算两个整形的乘积的过程:先把两个数字的各位保存在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 }

 

posted @ 2017-11-06 15:30  JiaJoa  阅读(965)  评论(0编辑  收藏  举报