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 }
  • 相关阅读:
    C#
    C#
    ssh学习笔记
    (已解决)Could not open '/var/lib/nova/mnt/*/volume-*': Permission denied
    RPCVersionCapError: Requested message version, 4.17 is incompatible. It needs to be equal in major version and less than or equal in minor version as the specified version cap 4.11.
    如何在linux下安装idea
    The system has no LUN copy license
    调整mysql数据库最大连接数
    mysql数据库编码问题
    cinder支持nfs快照
  • 原文地址:https://www.cnblogs.com/JiaJoa/p/7793398.html
Copyright © 2011-2022 走看看