2015-06-06 2 views
0

Мне нужно рассчитать разницу между элементами массива (только если следующий элемент больше предыдущего) и вернуть сумму этих различий первому элементу массива.Сумма разницы между элементами массива

3 
1 5 6 
ans = 1 + [5-1] + [6-5] = 6 

Это мой код:

#include <stdio.h> 

int main() { 
    long long int T, N, M[100000], i, j, diff[100000]; 
    int sum = 0; 
    scanf("%lld", &T); 

    while (T--) { 
    scanf("%lld", &N); 
    for (i = 0; i < N; i++) { 
     scanf("%lld", &M[i]); 
    } 
    for (i = 0; i < N-1; i++) { 
     if (M[i] < M[i+1]) { 
     diff[i] = M[i+1] - M[i]; 
     sum = sum + diff[i]; 
     } 
    } 
    printf("%d\n", sum + M[0]); 
    } 
    return 0; 
} 

Как это сделать?

+0

только первый тестовый пример показывает правильный выходной выход, все я получаю неправильный вывод – acus

+0

Каковы неудачные тестовые примеры? – bgoldst

+0

входные тестовые = 4 нет элементов = 4 элементы в массиве = 1 2 1 5 Выход 6 21 выход должен быть 6 6 6 6 – acus

ответ

0

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

Вы можете исправить это, установив sum = 0; в начале цикла while(T--).


Кроме того, вот как я бы переписать так:

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

typedef long long int num_t; 
#define NUMFMT "%lld" 

int main() { 

    num_t T; 
    scanf(NUMFMT,&T); 
    while (T--) { 
     num_t N; 
     scanf(NUMFMT,&N); 
     if (N < 1) { fprintf(stderr, "error: require at least one number.\n"); exit(1); } 
     N--; 
     num_t M1; 
     scanf(NUMFMT,&M1); 
     num_t sum = M1; 
     while (N--) { 
      num_t M2; 
      scanf(NUMFMT,&M2); 
      if (M1 < M2) 
       sum += M2-M1; 
      M1 = M2; 
     } // end while 
     printf(NUMFMT"\n",sum); 
    } // end while 

    return 0; 

} // end main() 

Демо:

ls; 
## acus.c 
gcc acus.c -o acus; 
ls; 
## acus.c acus* 
./acus; 
## 6 
## 1 5 
## 5 
## 3 1 2 3 
## 3 
## 3 3 2 1 
## 3 
## 3 1 5 6 
## 6 
## 4 6 4 2 3 
## 7 
## 0 
## error: require at least one number. 
0

Это должно быть действительно в обзоре кода ...

Ваш код читает T , а через цикл уничтожает его значение. Сделайте себе и читателю услугу и вызовите переменную «numberOfTestCases», а затем выполните цикл для (long long testCase = 0; testCase < numberOfTestCases; ++ testCase) ... Это стандартный способ написать цикл. И поверьте, более длинные имена переменных не замедляют работу кода.

Вы объявили M как длинный long int и суммируете как int. Теперь подумайте об этом: даже в самом тривиальном случае, когда M [0] = 0 и M [1]> 0, если M [1] велико, то он не будет вписываться в int. Это абсолютно не имеет смысла. Величины, которые суммируют, должны быть одинаковыми или большими, чем те, которые удерживаются М.

Вы указали и инициализировали сумму вне цикла для тестовых случаев. Вероятно, вы узнали, что переменная всегда должна быть инициализирована. НЕПРАВИЛЬНО. Инициализация здесь просто скрывает фатальную ошибку, и это значит, что вы снова не возвращаете сумму в 0. Вы должны были объявить сумму внутри вашего цикла, только для одного тестового примера. Объявление и инициализация за пределами цикла было ошибкой, ожидающей ее появления.

Разностный массив совершенно бессмыслен. Вы просто тратите 800 КБ памяти. Переменная j никогда не используется, что сбивает с толку.

Вы используете одно объявление для разных предметов, тип которых не связан. Тип T должен основываться на максимальном количестве наборов тестов, которые необходимо обработать. Тип N и i должен основываться на максимальном количестве значений в тесте. Тип M должен основываться на требовании о том, насколько велики могут быть входные значения. Эти три типа не связаны друг с другом, но вы используете одно объявление. «Ожидание аварии».

Ваше приложение будет разбиваться, если N> 100 000 или N = LLONG_MIN.

Вы ввели все свои функции в main(). Для этого не главное. main() должен настроить ваше приложение и начать работу. Скорее всего main() должен вызывать функцию do_homework, а do_homework должен вызывать функции read_data и calculate_sum.

+0

Я понял свои ошибки, и я выполнил, я буду иметь в виду в следующий раз спасибо за информацию. . Да, я просто новичок в программировании. – acus

Смежные вопросы