Сумма подряд идущих без индексации
Нужно написать программу для вычисления этой задачи, но использовать индексацию запрещено, необходимо использовать указатели
Дан массив целых чисел a[1], a[2], ..., a[n] и натуральные числа k и m.
Укажите минимальное значение i, для которого a[i] + a[i+1] + ... + a[i + k] = m (то есть сумма k + 1 подряд идущих элементов массива равна m).
Если такого значения нет, то выведите 0. Вложенные циклы и дополнительные массивы не использовать (требуется решить задачу за один проход исходного массива). Входные данные
На вход программе сначала подаются значения n, k и m (m <= 1000000000, 0 < k < n <= 100000; n - количество элементов в массиве). В следующей строке входных данных расположены сами элементы массива - целые числа, по модулю не превосходящие 100. Выходные данные
Выведите ответ на задачу.
Я написал следующий код
#include <iostream>
using namespace std;
void base_input(int& n) {
cin >> n;
}
void input(int mass[], int n) {
int* p = mass;
for (; p < mass + n; ++p) {
cin >> *(p);
}
}
int resolve(int mass[], int n, int k, int m) {
int summ = 0;
for (int* p = mass; p < mass + n; ++p) {
summ += *p;
if (p - mass > k) {
summ -= *(p - k - 1);
}
if (summ == m) {
return p - mass - k + 1;
}
}
return 0;
}
int main() {
int n;
base_input(n);
int k;
base_input(k);
int m;
base_input(m);
int mass[n];
input(mass, n);
cout << resolve(mass, n, k, m);
return 0;
}
но у меня не проходит 2 из 33 трех тестов, помогите найти ошибку
Ответы (1 шт):
Проще написать с нуля...
#include <iostream>
using namespace std;
int main()
{
int n,k,m, s = 0;
cin >> n >> k >> m;
int * a = new int[n];
for(int i = 0; i <= n; ++i) cin >> *(a+i);
for(int i = 0; i <= k; ++i) s += *(a+i);
if (s == m) { cout << 1; return 0; }
for(int i = 0, j = k+1; j < n; ++j, ++i)
if ((s = s - *(a+i)+*(a+j)) == m) { cout << (i+2); return 0; }
cout << 0;
}