#java #c #arrays #algorithm
#java #c #массивы #алгоритм
Вопрос:
Я хочу добавить диагонали в квадратную или прямоугольную матрицу, чтобы эмулировать процесс добавления частичных результатов в алгоритм умножения.
Вот так:
2412
x 3231
---------
2412
7236
4824
7236
---------
7793172
Мне нужно выполнить это, шаг за шагом, чтобы удовлетворить требованиям онлайн-программы оценки. Я уже выяснил, как получить частичные результаты умножения (числа 2412, 7236, 4824, 7236), и я поместил их в квадратную матрицу.
Я понял, что могу получить результат сложения этой матрицы, рассматривая квадратную или прямоугольную форму, такую:
2 4 1 2
7 2 3 6
4 8 2 4
7 2 3 6
и получаем результат сложения, складывая каждую диагональ (начиная с верхней правой) и принимая во внимание перенос сложения и используя вспомогательный массив, который имеет то же количество цифр, что и number_of_digits_in_operand_a number_of_digits_in_operand_b (в данном случае операнд a равен 2412, а операнд b равен 3231).
Например, результат массива в его самой правой позиции должен быть:
result[(digits_a digits_b)-1] = partialResult[0][3];
Далее:
result[digits_a digits_b]=(partialResult[0][2] partialResult[1][3] carry) ;
newCarry = (partialResult[0][2] partialResult[1][3] carry) / 10;
Ну, я застрял в написании двойного вложенного цикла, который должен добавлять эти диагонали, начиная с верхней правой. Справка. Пожалуйста.
Комментарии:
1. Можете ли вы добавить 0 в конце каждой строки, чтобы уравнять, чтобы вы могли просто суммировать их?
2. Если это домашнее задание (и для меня это действительно звучит так), не могли бы вы любезно добавить к нему
homework
тег?
Ответ №1:
В итоге я использовал это (не спрашивайте, почему это преобразует BigInteger в ArrayList и наоборот, это странное требование к домашнему заданию).
public static BigInteger simpleMultiply(BigInteger x, BigInteger y) throws IOException {
char [] longerNum;
char [] shorterNum;
ArrayList<Integer> multResult= new ArrayList<Integer>(2000);
if(x.compareTo(y)>=0){ // x is a longer/equal num
longerNum = x.toString().toCharArray();
shorterNum = y.toString().toCharArray();
}
else { //y is a longer num
longerNum = y.toString().toCharArray();
shorterNum = x.toString().toCharArray();
}
//shorter num equals the number of rows in partial result
// longer num 1 equals the number of columns in partial result
int [][] partialResult = new int [shorterNum.length][longerNum.length 1];
int pastCarry=0;
int result=0;
int carry=0;
for (int sIndex=(shorterNum.length-1); sIndex>=0; sIndex--){
pastCarry=0;
for (int lIndex = (longerNum.length-1); lIndex>=0; lIndex--)
{
int sInt = Integer.parseInt("" shorterNum[sIndex] "");
int lInt = Integer.parseInt("" longerNum[lIndex] "");
int product = sInt*lInt;
if (lIndex==0){
result = (pastCarry product)% 10;
carry = (pastCarry product) / 10;
pastCarry = carry;
partialResult [sIndex][lIndex 1] = resu< //one more column element in partialResult
partialResult[sIndex][lIndex] = carry;
}
else {
result = (pastCarry product) % 10;
carry = (pastCarry product) / 10;
pastCarry = carry;
partialResult [sIndex][lIndex 1] = resu<//one more column element in partialResult
}
}
}
for (int i=0; i<partialResult.length;i )
for (int j=0; j<partialResult[0].length;j )
{
System.out.print(partialResult[i][j] " ");
if (j==partialResult[0].length-1){System.out.println();}
}
int auxColumn=0;
int diagonalAcum=0;
//add diagonals
int copyDigit=0;
int carryDigit=0;
int lastCarry=0;
rowCycle:
for (int column=partialResult[0].length-1; column>=0; column--){
diagonalAcum=0; //carryDigit=0;
diagonalAcum =carryDigit;
auxColumn=column;
for (int row=0; row<partialResult.length; row ){
if (auxColumn 1 ==partialResult[0].length){
diagonalAcum =partialResult[row][auxColumn ];
copyDigit=diagonalAcum % 10;
carryDigit=diagonalAcum / 10;
multResult.add(copyDigit);
continue rowCycle;
}
diagonalAcum =partialResult[row][auxColumn ];
} //end row cycle
copyDigit= diagonalAcum % 10;
carryDigit=diagonalAcum / 10;
multResult.add(copyDigit);
if(column==0){
lastCarry = carryDigit;
}
}
carryDigit=0; //reset
int diagonal2Acum=0;
// diagonal2Acum =lastCarry;
int auxRow;
int diagCarry=0;
int rowLimit=partialResult.length-1;
int colLimit=partialResult[0].length-1;
int initialRow=1;
int colIndex=0;
for (int row=initialRow;row<=rowLimit;row ){
diagonal2Acum=0;
diagonal2Acum =lastCarry;
lastCarry=0;
auxRow = row;
colIndex=0;
// partialResult[auxRow][]
while ((auxRow<=rowLimit) amp;amp; (colIndex<=colLimit)){
diagonal2Acum = partialResult[auxRow ][colIndex ];
}
if ((colIndex==0)amp;amp;(row==rowLimit)) {
copyDigit=(diagonal2Acum carryDigit);
carryDigit=(diagonal2Acum carryDigit)/10;
multResult.add(copyDigit);
multResult.add(carryDigit);
}
else {
copyDigit=(diagonal2Acum carryDigit);
carryDigit=(diagonal2Acum carryDigit)/10;
multResult.add(copyDigit);
}
} // end row for
StringBuilder appended = new StringBuilder();
for (int i=multResult.size()-1;i>=0;i--){
appended.append(multResult.get(i));
}
System.out.println("result is " appended.toString());
BigInteger the_result1 = new BigInteger(appended.toString());
return the_result1;
}
Ответ №2:
Предположим, что ваши partialResult
размеры равны width
и height
вы можете добавить с помощью следующих двух циклов (смотрите это здесь в действии):
int digit = width height - 1;
int carry = 0;
for (int d1 = width - 1; d1 >= 0; d1--) {
for (int r = 0; r < height amp;amp; d1 r < width; r )
carry = partialResult[r][d1 r];
result[--digit] = carry % 10;
carry /= 10;
}
for (int d2 = 1; d2 < height; d2 ) {
for (int c = 0; c < width amp;amp; d2 c < height; c )
carry = partialResult[d2 c][c];
result[--digit] = carry % 10;
carry /= 10;
}
Примечание: Перенос может быть непустым в конце, что означает еще одну цифру перед первой в результате.