Вы код не получится следующий тестовый случай (по крайней мере):
1
4
47 -47 48 -1
Ваши программы дают ответ , где в качестве ответа должен быть , где 3 последовательности следующим образом:
47 -47 48 -1 [The entire sequence]
47 [1st element only]
48 -1 [3rd plus 4th elements]
Таким образом, ясно, что у вас есть ошибки.
PS: Кстати, почему вы объявляя массив п + 1 пунктов: long arr[n+1];
, когда вы никогда не будут ссылаться на arr[n]
? (На самом деле этот пункт даже не существует)
[Edit] #: Добавление пояснений для вышеприведенного использования случай
Как об этом - Его проще, чем вы думаете :-)
Сканирование номеров серийно. Для каждого встреченного числа добавьте его к сумме, найденной до сих пор.
Сохраните карту количества раз, когда сумма (до сих пор) была найдена.
Теперь, чтобы сделать в общей сложности 47, нужно только найти число, которое при вычитании из суммы должно дать число 47. Это необходимо, потому что если мы вычтем такое количество из найденной суммы , это даст 47, полученный из суммирования некоторой последовательности (s) смежных чисел.
Возьмем пример выше, 47 -47 48 -1
Инициализировать карту с номером 0, имеющий счетчик = 0 (Это означает, что мы нашли не сумма до сих пор ровно один раз - так как мы в начале)
Сканирование списка с самого начала, взять номер 47, сумма до сих пор, скажем, с = 47. Мы делаем 2 вещи:
- map (47) = 1 (поскольку мы нашли сумму до сих пор = 47 в первый раз).
- Теперь нам нужно найти количество раз, мы можем найти s-47 = 0 (что равно 1).Итак, ответьте до сих пор = map (0) = 1
Сделайте следующий номер, -47. Сумма до сих пор, с = 0
- карта (0) = 1 до сих пор, так что никакой карты (0) становится = 2
- Нам нужно найти количество вхождений S-47 = -47. Что = 0. Таким образом, ответ до сих пор = ответа до сих пор + 0 (остается = 1)
Возьмите следующий номер, 48, сумма до сих пор, s = 48
- карта (48) = 1
- Нам нужно найти количество вхождений s-48 = -1. Что = 0. Таким образом, ответ до сих пор = ответа до сих пор + 0 (остается = 1)
Возьмите последний номер, -1, сумма до сих пор, s = 47
- карты (47) = 1 (на шаге 2.1), так что теперь отображение (47) становится = 2
- Нам нужно найти число вхождений s-47 = 0. Который = 2 (на шаге 3.1). Поэтому ответ до сих пор = ответ до сих пор + 2 = 3
Так окончательный ответ =
Это должно быть довольно тривиально закодировать это.
Что мешает вам отлаживать это обычным способом, например. добавление операторов printf или использование отладчика? –
@PaulR Я пробовал все типы тестовых примеров, но я не могу получить случай, когда я ошибаюсь. – sp1rs
Это не C++, это C. Не только из-за всего стиля ввода-вывода ('printf' и' scanf' вместо потоков), а потому, что он использует массивы переменной длины, которых нет в C++. Пожалуйста, верните свой вопрос соответствующим образом или исправьте код. (И исправьте свой отступ, пока вы на нем). – Angew