RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 900230
Accepted
Vitaliy Tretyakov
Vitaliy Tretyakov
Asked:2020-10-31 16:23:03 +0000 UTC2020-10-31 16:23:03 +0000 UTC 2020-10-31 16:23:03 +0000 UTC

列乘法是缩进的问题。爪哇

  • 772

任务是将列中的两个数字相乘。一切都变了,除了压痕,一切看起来都很漂亮。

从主类 LongMultiplication.java:

package info.sjd;

import info.sjd.service.*;

public class LongMultiplication {

    public static void main(String[] args) {

        LongMultiplicationService.printLongMultiplication(1234, 123);
    }
}

我从服务类调用方法:

package info.sjd.service;

public class LongMultiplicationService {
    // Задаем отступ слева
    private static int shiftNumber = 20;

    //  Метод возвращает более длинное из двух чисел
    public static int findLongerNumber(int firstNumber, int secondNumber) {
        int longerNumber = 0;
        if (String.valueOf(firstNumber).length() < String.valueOf(secondNumber).length()) {
            longerNumber = secondNumber;
        } else {
            longerNumber = firstNumber;
        }
        return longerNumber;
    }

    //  Метод возвращает более короткое из двух чисел
    public static int findShorterNumber(int firstNumber, int secondNumber) {
        int shorterNumber = 0;
        if (String.valueOf(firstNumber).length() > String.valueOf(secondNumber).length()) {
            shorterNumber = secondNumber;
        } else {
            shorterNumber = firstNumber;
        }
        return shorterNumber;
    }

    // Метод печатает нужное количество нужных символов подряд без перевода строки в конце
    public static void repeatNSymbols(int n, String symbol) {
        String resultString = "";
        for (int i = 0; i < n; i++) {
            resultString += symbol;
        }
        System.out.print(resultString);     
    }

    // Метод печатает нужное количество нужных символов подряд с переводом строки в конце
    public static void repeatNSymbolsNewLine (int n, String symbol) {
        String resultString = "";
        for (int i = 0; i < n; i++) {
            resultString += symbol;

        }
        System.out.print(resultString); 
        System.out.println("");
    }

    // Метод печатает промежуточные вычисления - произведения первого числа на каждый из разрядов второго числа
    public static void intermediateMultiplication(int firstNumber, int secondNumber) {

        int rightShift = 1;
        while (secondNumber > 0) {
            System.out.println(firstNumber * (secondNumber % 10));
            secondNumber /= 10;
            repeatNSymbols(shiftNumber - rightShift, " ");
            rightShift++;
        }
        repeatNSymbols(1, " ");
    }
    // Метод сводит всё в одну конструкцию
    public static void printLongMultiplication(int firstNumber, int secondNumber) {
        repeatNSymbols(shiftNumber, " ");
        System.out.println(String.valueOf(findLongerNumber(firstNumber, secondNumber)));
        repeatNSymbols(shiftNumber - 1, " ");
        System.out.println("x");
        repeatNSymbols(shiftNumber, " ");
        repeatNSymbols(String.valueOf(findLongerNumber(firstNumber, secondNumber)).length() - String.valueOf(findShorterNumber(firstNumber, secondNumber)).length(), " ");
        System.out.println(String.valueOf(findShorterNumber(firstNumber, secondNumber)));
        repeatNSymbols(shiftNumber, " ");
        repeatNSymbolsNewLine(String.valueOf(findLongerNumber(firstNumber, secondNumber)).length(), "_");
        repeatNSymbols(shiftNumber, " ");
        intermediateMultiplication(findLongerNumber(firstNumber, secondNumber), findShorterNumber(firstNumber, secondNumber));
        repeatNSymbolsNewLine(String.valueOf(String.valueOf(firstNumber * secondNumber)).length(), "_");
        repeatNSymbols(shiftNumber - (String.valueOf(findLongerNumber(firstNumber, secondNumber)).length() - String.valueOf(findShorterNumber(firstNumber, secondNumber)).length()) - 1, " ");
        System.out.println(firstNumber * secondNumber);
    }
}

我很困惑,无法弄清楚如何为任意数字组织行的左移。到目前为止,事实证明它是为特定的一对“定制”的——只有这样它看起来才“漂亮”。

如何使用两个数字的长度和其中一个数字的中间乘积对另一个数字的每个数字进行操作,以使其在一般情况下对于任意长度的数字变得美观?

在此处输入图像描述

添加图片以了解问题。那些。现在我刚刚调整了移位以适应 1234x123 的情况,一切看起来都完全正确。但是当其他数字相乘时,不和谐就开始了。

java
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    Serhii Dikobrazko
    2020-10-31T18:51:50Z2020-10-31T18:51:50Z

    作为一种选择。您将缩进设置为固定值 20,但您需要从宽度开始,因为实际上我们锚定到右边缘,尽管我们从左到右打印。

    整个列的最大宽度将是结果的长度+1,因此乘号也适合。现在从这个宽度开始。

    第一个因素的缩进 = 宽度 - 第一个因素中的位数,对于第二个因素,它是相同的,因为乘号取最长的数字。

    对于每个中间结果,缩进将等于宽度 - 长度 -1,对于每个下一个 -1。
    稍微改写一下就好了

    public class LongMultiplicationService {
        // Задаем отступ слева
        private static int shiftNumber = 20;
    
        //  Метод возвращает более длинное из двух чисел
        public static int findLongerNumber(int firstNumber, int secondNumber) {
            int longerNumber = 0;
            if (String.valueOf(firstNumber).length() < String.valueOf(secondNumber).length()) {
                longerNumber = secondNumber;
            } else {
                longerNumber = firstNumber;
            }
            return longerNumber;
        }
    
        //  Метод возвращает более короткое из двух чисел
        public static int findShorterNumber(int firstNumber, int secondNumber) {
            int shorterNumber = 0;
            if (String.valueOf(firstNumber).length() > String.valueOf(secondNumber).length()) {
                shorterNumber = secondNumber;
            } else {
                shorterNumber = firstNumber;
            }
            return shorterNumber;
        }
    
        // Метод печатает нужное количество нужных символов подряд без перевода строки в конце
        public static void repeatNSymbols(int n, String symbol) {
            String resultString = "";
            for (int i = 0; i < n; i++) {
                resultString += symbol;
            }
            System.out.print(resultString);
        }
    
        // Метод печатает нужное количество нужных символов подряд с переводом строки в конце
        public static void repeatNSymbolsNewLine (int n, String symbol) {
            String resultString = "";
            for (int i = 0; i < n; i++) {
                resultString += symbol;
    
            }
            System.out.print(resultString);
            System.out.println("");
        }
    
        // Метод печатает промежуточные вычисления - произведения первого числа на каждый из разрядов второго числа
        public static void intermediateMultiplication(int firstNumber, int secondNumber) {
    
            int rightShift = 1;
            while (secondNumber > 0) {
                int number = firstNumber * (secondNumber % 10);
                secondNumber /= 10;
                repeatNSymbols(width - rightShift - String.valueOf(number).length(), " ");
                System.out.println(number);
                rightShift++;
            }
            repeatNSymbols(1, " ");
        }
        static int width =0;
        // Метод сводит всё в одну конструкцию
        public static void printLongMultiplication(int firstNumber, int secondNumber) {
            width =0;
            shiftNumber =20;
            repeatNSymbols(shiftNumber, " ");
            System.out.println(String.valueOf(findLongerNumber(firstNumber, secondNumber)));
            width = shiftNumber + String.valueOf(findLongerNumber(firstNumber, secondNumber)).length();
            repeatNSymbols(shiftNumber - 1, " ");
            System.out.println("x");
            repeatNSymbols(shiftNumber, " ");
            repeatNSymbols(String.valueOf(findLongerNumber(firstNumber, secondNumber)).length() - String.valueOf(findShorterNumber(firstNumber, secondNumber)).length(), " ");
            System.out.println(String.valueOf(findShorterNumber(firstNumber, secondNumber)));
            repeatNSymbols(shiftNumber, " ");
            repeatNSymbolsNewLine(String.valueOf(findLongerNumber(firstNumber, secondNumber)).length(), "_");
            intermediateMultiplication(findLongerNumber(firstNumber, secondNumber), findShorterNumber(firstNumber, secondNumber));
            repeatNSymbols(width -String.valueOf(String.valueOf(firstNumber * secondNumber)).length() -1, " ");
            repeatNSymbolsNewLine(String.valueOf(String.valueOf(firstNumber * secondNumber)).length(), "_");
    
            repeatNSymbols(width - String.valueOf(firstNumber * secondNumber).length(), " ");
            System.out.println(firstNumber * secondNumber);
        }
    }
    
    • 1

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    是否可以在 C++ 中继承类 <---> 结构?

    • 2 个回答
  • Marko Smith

    这种神经网络架构适合文本分类吗?

    • 1 个回答
  • Marko Smith

    为什么分配的工作方式不同?

    • 3 个回答
  • Marko Smith

    控制台中的光标坐标

    • 1 个回答
  • Marko Smith

    如何在 C++ 中删除类的实例?

    • 4 个回答
  • Marko Smith

    点是否属于线段的问题

    • 2 个回答
  • Marko Smith

    json结构错误

    • 1 个回答
  • Marko Smith

    ServiceWorker 中的“获取”事件

    • 1 个回答
  • Marko Smith

    c ++控制台应用程序exe文件[重复]

    • 1 个回答
  • Marko Smith

    按多列从sql表中选择

    • 1 个回答
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Suvitruf - Andrei Apanasik 什么是空? 2020-08-21 01:48:09 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5