Java: как суммировать элементы массива один за другим в одном массиве

1

Я искал и много думал об этом, но не мог найти решение.

Учитывая массив чисел, я должен суммировать каждый элемент со следующим и записывать его в один и тот же массив, затем снова и снова, пока первая позиция [0] массива не содержит сумму всех элементов.
Например: test[] = {1, 2, 3, 4, 5}
следующим шагом будет:
test[0] = test[0] + test[1] = 1 + 2 = 3;
test[1] = test[2] + test[3] = 3 + 4 = 7;
test[2] = test[4] = 5;
массив становится: { 3, 7, 5, 4, 5}

то он повторяется снова:
test[0] = test[0] + test[1] = 3 + 7 = 10;
test[1] = test[3] = 5;
массив становится: { 10, 5, 5, 4, 5}

то окончательно снова:
test[0] = test[0] + test[1] = 10 + 5 = 15;
массив становится: { 15, 5, 5, 4, 5}

Я знаю, что List будет правильным решением, но упражнение должно решить его с помощью простого массива. Все предложения приветствуются!

Опять же: эта задача связана не с эффективностью, а с ее решением с использованием массивов. Извините, это мой первый пост, и это выглядит беспорядочно.

Редактировать:
Что я придумал, так это:
for (int я = 0; я < test.length - (test.length/2); i++) { test[i] = test[2 * i] + test[2 * я + 1]; }
но он работает только с равным количеством заданных чисел, и он должен быть в цикле, чтобы повторять правильное количество раз.

  • 0
    Для первого элемента, что вы делаете? Для второго элемента, что вы делаете? Для последнего элемента, что вы делаете?
  • 0
    test[0] += test[i] в каком-то цикле
Показать ещё 9 комментариев
Теги:

3 ответа

0
Лучший ответ

Это грязно, но работает. Он изменяет массив на месте, каждый раз переписывая половину (суммируется) массива, причем нечетные суммы сохраняются на месте.

int[] test = { 1, 2, 3, 4, 5, 6 };
int l = test.length;
do {
    l = sumTo(test, l);
} while (l > 1);
System.out.println(Arrays.toString(test));

sumTo принимает два аргумента, модифицируемый массив и индекс для суммирования.

int sumTo(int[] ar, int to) {
    int i;
    for (i = 0; i < to; i += 2) {
        if (i == to - 1)
            ar[i / 2] = ar[i];
        else
            ar[i / 2] = ar[i] + ar[i + 1];
        }
    return (i + 1) / 2;
}
  • 0
    Я могу подтвердить, что это работает! Теперь я должен понять, как XD
  • 0
    переменная l / to - это сумма массива, который мы суммируем каждый раз. Каждую итерацию вы делите массив пополам, округляя. Когда остается только один элемент, это сумма массива
0
public static void main(String[] args) {
    int[] tab = new int[]{1,2,3,4};
    tab[0] += tab[1];
    tab[1] = tab[2]+tab[3];
}

Это может соответствовать вашему описанию.

  • 0
    это не работает
0

Попробуй это:

double f = test.length;
for(int j =0; j<=(int)(Math.log(f)/Math.log(2));j++){ //here i want the exponent
    int q = (int)Math.ceil(f/Math.pow(2,j)); //simplified because it calculated once
    for (int i = 0; i<q; i+=2){
        if(i<q-1){
           test[i] += test[i+1];
           test[i/2] = test[i];
        else{
           test[i/2] = test[i];
        }
     }
 }
  • 0
    Эта задача не об эффективности, а о ее решении с помощью всего лишь массива. Ваше решение просто добавляет все элементы в первый, но это не то, что требует задача. Я должен добавить все элементы в пару, затем снова и снова, пока у меня не будет общая сумма на позиции [0].
  • 0
    Ах, понял. Полезно для слияния файлов. Дайте мне секунду, и я исправлю то, что у меня есть, я делал это раньше.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню