zoukankan      html  css  js  c++  java
  • 计算两个用字符串表示的数字的乘积(包括不带小数位与带小数位情形)

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

    计算两个整形的乘积的过程:先把两个数字的各位保存在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 }
  • 相关阅读:
    题解:luoguP1070 道路游戏(DP)
    题解:luoguP2577【ZJOI2005】午餐(DP)
    题解:bzoj1801: [Ahoi2009]chess 中国象棋
    题解:bzoj1878: [SDOI2009]HH的项链
    SpringBoot静态资源文件 lion
    简要的Log4Net 应用配置
    Web Service 初级教程
    log4Net 动态改变写入文件
    Ornament 类型资源权限
    JQuery 引发两次$(document).ready事件
  • 原文地址:https://www.cnblogs.com/JiaJoa/p/7793398.html
Copyright © 2011-2022 走看看