#java #arrays #addition
#java #массивы #добавление
Вопрос:
Я хочу взять два массива целых чисел и сложить их вместе, но у меня возникли некоторые трудности с переносным битом.
public static int [] add(int [] a, int [] b)
{
int col = 0;
int carry = 0;
int[] totalArray = new int[MAX_DIGITS 1];
for(int i = MAX_DIGITS - 1; i > 0; i--) {
col = a[i] b[i] carry;
if(col >= 10) {
carry = col / 10;
totalArray[i] %= 10;
} else {
totalArray[i] = col;
carry = 0;
}
}
totalArray[0] = carry;
return totalArray;
}
Приведенный выше код добавляет 204 435 правильно, но не добавляет 22 3122 12 правильно (пункты 65).
Я написал другие методы, чтобы убедиться, что все цифры правильно проиндексированы в массиве, и протестировал эти методы. Видя, что это работает для 204 435, но не для другого, я не вижу, что меня сбивает с толку. Я не хочу использовать класс BigInteger — прежде чем кто-либо предложит мне это сделать.
Учитывая int[]a [0000000000000000000000999] и int[]b [0000000000000000000000483] в настоящее время add(a,b) возвращает [0000000000000000000001000]
Комментарии:
1. Как вы добавляете 3 значения, когда ваш метод принимает только 2 параметра?
2. Я предлагаю написать несколько тестов и добавить их к вашему вопросу, чтобы мы могли точно видеть, какие данные вы используете.
3. @tgdavies готово!
4. Какое значение
MAX_DIGITS
? Кроме того,for(int i = MAX_DIGITS - 1; i > 0; i--)
должно быть...i>=0...
(вы хотите изучить первую цифру, не так ли?)
Ответ №1:
Это работает просто отлично. Просто убедитесь, что все ваши массивы занимают только места 1 thru MAX_DIGITS-1
с фактическими значениями. Это позволяет переносить в totalArray[0]
.
static int MAX_DIGITS = 6;
int[] a = {0,0,0,0,2,2};
int [] b = {0,0,3,1,2,2};
int [] c = {0,0,0,0,1,2};
int[] part1 = add(a,b);
int [] total = add(part1, c);
System.out.println(Arrays.toString(total));
С принтами
[0, 0, 3, 1, 5, 6]
- Все, что я сделал, это уменьшил размер
totalArray
массива доMAX_DIGITS
- и измените значение
i > 0
наi >= 0
в цикле. - убедитесь, что
index 0
это было0
во всех массивах. - остальное было вашим кодом.
public static int[] add(int[] a, int[] b) {
int col = 0;
int carry = 0;
int[] totalArray = new int[MAX_DIGITS];
for (int i = MAX_DIGITS-1; i >= 0; i--) {
col = a[i] b[i] carry;
if (col >= 10) {
carry = col / 10;
totalArray[i] %= 10;
} else {
totalArray[i] = col;
carry = 0;
}
}
totalArray[0] = carry;
return totalArray;
}
Комментарии:
1. Спасибо за вклад, и хотя это верный аргумент, это не было проблемой. Он прерывается только тогда, когда должен содержать цифру
2. Поскольку totalArray на единицу больше, чем массивы аргументов, разве вы не должны добавлять 1 к индексу totalArray? Я внес изменения, и это сработало для меня.
3. оказывается, я на самом деле не добавлял один к общему массиву, скорее я изменил инициализацию общего массива на int[] totalArray = new int[MAX_DIGITS]; Проблема была в if(col > = 10), когда я делал totalArray[i] % = 10; он должен иметьбыл totalArray[i] = col % 10;