Сумма i-х элементов массива

#c #algorithm

#c #алгоритм

Вопрос:

Программа получает массив целых чисел. Необходимо в каждой новой строке выводить сумму i-го элемента массива. Например, для такого массива {1, 2, 3, 4, 5, 6, 7, 8, 9, 10} ответ будет таким :

 55 //1 2 3 4 5 6 7 8 9 10
30 //2 4 6 8 10
18 //3 6 9
12 //4 8
15 //5 10
6  //6
7  //7
8  //8
9  //9
10 //10
  

Вот мой код, который решает эту проблему:

 #include <string.h> 
#include <stdlib.h>
#include <stdio.h> 

int main(void) { 
    int N, i, j, S; 
    scanf("%d",amp;N); //length of array
    int a[N];
    for(i = 0; i < N;   i) scanf("%d",amp;a[i]); 
    for(i = 1; i <= N;   i) {
        S = 0;
        for(j = 0; j < N;   j) 
            S  = !((j 1)%i) ? a[j] : 0; 
        printf("%dn",S);
    }
    return 0;
}
  

Моя проблема в том, что мой алгоритм недостаточно быстр. А на больших данных его скорость очень низкая.
Я попытался придумать алгоритм, который бы рекурсивно вычислял сначала небольшие суммы, а затем вычислял другие. Но мне не удалось это реализовать.

Пожалуйста, не могли бы вы дать мне более элегантный вариант решения этой проблемы.

Ответ №1:

Простая модификация помогает избежать проверки всех индексов:

 for(j = i - 1; j < N; j  = i) 
        S  = a[j]; 
  

Комментарии:

1. В выражении инициализации цикла for, я думаю j = i; , должно быть j = i - 1; .

2. Да, я запутался с нумерацией 1/0

Ответ №2:

for Цикл не должен увеличивать переменную итератора только на единицу, вы можете добавить к ней любую сумму, например a[i - 1] , как в:

 for(j = 0; j < N; j  = a[i - 1])
  

Это означает, что самый внутренний цикл не будет выполняться столько раз в последующих итерациях.

Это также означает, что вы можете просто пропустить условие внутри самого внутреннего цикла и просто выполнить

 S  = a[j];
  

Примечание: это не проверено и может потребовать некоторой настройки. Общий принцип — важная часть: делай меньше!