• java版大数相乘


    在搞ACM的时候遇到大数相乘的问题,在网上找了一下,看到了一个c++版本的

    http://blog.csdn.net/jianzhibeihang/article/details/4948267

    用java搞了一个版本

    这里说一下思路

    将数字已字符串形式接收,转换成int[]整型数组,然后num1[],num2[]依次相乘,结果保存到result[]中

    其他注意的在注释中有说明

     1 package com.gxf.test;
     2 
     3 import java.util.Scanner;
     4 
     5 public class BigDataMultiply {
     6 
     7     public static void main(String[] args) {
     8         final int N = 100;//最大为100位数字相乘
     9         Scanner scanner = new Scanner(System.in);
    10         
    11         int num1[] = getNum(scanner);//保存第一个数12345
    12         int num2[] = getNum(scanner);//保存第二个数12345
    13         
    14         int result[] = new int[2 * N];
    15         //第一个数12345每一位乘以第二个数12345的每一位,得到的结果放到result[]中
    16         //注意5乘以每一位数字保存在result[0] [1] [2] [3] [4]中
    17         //4乘以每一位数字时要加上[1] [2] [3] [4]中的值 
    18         for(int i = 0; i < num1.length; i++){
    19             for(int j = 0; j < num2.length; j++){
    20                 result[i + j] += num1[i] * num2[j];
    21             }
    22         }//得到的结果还需进位和移位处理
    23         //进位和移位处理
    24         for(int i = 0; i < 2 * N - 1; i++){
    25             result[i + 1] += result[i] / 10;
    26             result[i] = result[i] % 10;
    27         }
    28         //找出结果长度
    29         int length = 2 * N -1;
    30         while(result[length] == 0)
    31             length--;
    32         //输出结果 注意先输出高位 最高位保存在数组的高下标中  
    33         for(int i = length; i >= 0; i--){
    34             System.out.print(result[i] + " ");
    35         }
    36         scanner.close();
    37     }
    38     public static int[] getNum(Scanner scanner){
    39         final int N = 100;
    40         int num[] = new int[N];
    41         char array_char[];
    42         String str_num = "";
    43         //Scanner scanner = new Scanner(System.in);//用于接收输入
    44         
    45         str_num = scanner.next();
    46         array_char = str_num.toCharArray();//字符串12345已经转换成字符数组
    47         //将字符数组转换成Int数组
    48         int length = array_char.length;
    49         for(int i = 0; i < array_char.length; i++){
    50             num[length - i - 1] = array_char[i] - '0';//这里注意保存的位置 高位保存在数组高下标中 低位保存在数组低下标中 
    51             //因为后面计算的时候是从低下标中的
    52             //num[i] = array_char[i]
    53         }        
    54         //scanner.close();
    55         return num;
    56     }
    57 }

    ps:为什么这里result[]大小是2*N,假设两个数是3位数,如565 * 898不可能大过1000 * 1000,而1000 * 1000的位数刚好是 2 * 3 = 6位

  • 相关阅读:
    052-14
    052-13
    css垂直居中
    js中的null 和undefined
    给数组添加属性
    js中避免函数名和变量名跟别人冲突
    js变量问题
    Life
    BFC和haslayout
    json文件
  • 原文地址:https://www.cnblogs.com/luckygxf/p/4063529.html
Copyright © 2020-2023  润新知