任务是将列中的两个数字相乘。一切都变了,除了压痕,一切看起来都很漂亮。
从主类 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 的情况,一切看起来都完全正确。但是当其他数字相乘时,不和谐就开始了。

作为一种选择。您将缩进设置为固定值 20,但您需要从宽度开始,因为实际上我们锚定到右边缘,尽管我们从左到右打印。
整个列的最大宽度将是结果的长度+1,因此乘号也适合。现在从这个宽度开始。
第一个因素的缩进 = 宽度 - 第一个因素中的位数,对于第二个因素,它是相同的,因为乘号取最长的数字。
对于每个中间结果,缩进将等于宽度 - 长度 -1,对于每个下一个 -1。
稍微改写一下就好了