• 算法笔记_097:蓝桥杯练习 算法提高 P1001(Java)


    目录

    1 问题描述

    2 解决方案

     


    1 问题描述

    当两个比较大的整数相乘时,可能会出现数据溢出的情形。为避免溢出,可以采用字符串的方法来实现两个大数之间的乘法。具体来说,首先以字符串的形式输入两个整数,每个整数的长度不会超过8位,然后把它们相乘的结果存储在另一个字符串当中(长度不会超过16位),最后把这个字符串打印出来。例如,假设用户输入为:62773417和12345678,则输出结果为:774980393241726.

    输入:
      62773417 12345678

    输出:
      774980393241726


    2 解决方案

    此题考查使用字符串来计算具体整数的乘法运算,由于题目说明输入的均为数字,所以代码中不需要做出是否为数字的判断,但要防备一点,输出负数的情况。虽然,测试数据中没有负数情况,但是做题的时候还是要考虑到~

     

    具体代码如下:

    import java.util.Scanner;
    
    public class Main {
        
        public void printResult(String A, String B) {
            char[] arrayA = A.toCharArray();
            char[] arrayB = B.toCharArray();
            int len = A.length() + B.length();
            
            int judge = 1;   //用于判定A*B最终结果正负,1代表为正,-1表示为负
            int enda = 0, endb = 0;   //用于指定A和B中最后一个数字的位置(从后往前遍历)
            if(arrayA[0] == '-' && arrayB[0] != '-') {
                judge = -1;
                len = len - 1;
                enda = 1;
            } else if(arrayA[0] != '-' && arrayB[0] == '-') {
                judge = -1;
                len = len - 1;
                endb = 1;
            } else if(arrayA[0] == '-' && arrayB[0] == '-') {
                len = len - 2;
                enda = 1;
                endb = 1;
            }
            
            int[] result = new int[len];
            int a, b;
            for(int i = A.length() - 1, tempi = 0; i >= enda;i--,tempi++) {
                a = arrayA[i] - '0';
                for(int j = B.length() - 1, tempj = 0;j >= endb;j--, tempj++) {
                    b = arrayB[j] - '0';    
                    result[len-tempi-tempj-2] += (result[len-tempi-tempj-1] + a * b) / 10;  //进位操作    
                    result[len-tempi-tempj-1] = (result[len-tempi-tempj-1] + a * b) % 10;  //当前位的数
                }
            }
            int i = 0;
            while(result[i] == 0 && i < len - 1)
                i++;  //除去结果前面的所有多余0,此处使用len-1是因为,若结果全为0,输出最后一个0
            if(judge == -1)
                System.out.print("-");
            for(;i < len;i++)
                System.out.print(result[i]);
        }
        
        public static void main(String[] args) {
            Main test = new Main();
            Scanner in = new Scanner(System.in);
            String A = in.next();  //注意,in.next表示遇到空格就不再读入
            String B = in.next();
            test.printResult(A, B);
        }
    }
  • 相关阅读:
    IDEA 远程调试springboot
    Mybatitas-plus实现逻辑删除
    java通过poi导出excel
    js 展示当前时间
    Linux环境下服务自启
    Spring自带定时器@Scheduled
    Quartz任务调度框架相关方法、参数理解
    Quartz 实现定时任务
    mysql 使用union(all) + order by 导致排序失效
    mongodb的查询操作
  • 原文地址:https://www.cnblogs.com/liuzhen1995/p/6580724.html
Copyright © 2020-2023  润新知