Я искал и много думал об этом, но не мог найти решение.
Учитывая массив чисел, я должен суммировать каждый элемент со следующим и записывать его в один и тот же массив, затем снова и снова, пока первая позиция [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]; }
но он работает только с равным количеством заданных чисел, и он должен быть в цикле, чтобы повторять правильное количество раз.
Это грязно, но работает. Он изменяет массив на месте, каждый раз переписывая половину (суммируется) массива, причем нечетные суммы сохраняются на месте.
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;
}
public static void main(String[] args) {
int[] tab = new int[]{1,2,3,4};
tab[0] += tab[1];
tab[1] = tab[2]+tab[3];
}
Это может соответствовать вашему описанию.
Попробуй это:
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];
}
}
}
test[0] += test[i]
в каком-то цикле