C/C++

Помогите с задачкой на Си

★    Любопытно, а в каком направлении производить замену: от начала матрицы к её концу или наоборот?

   Ведь в первом случае уже вычисленные суммы участвуют в формировании последующих сумм. Последняя сумма накапливается как лавина.
Роман )
Роман )
16 172
Лучший ответ
Спасибо, задача интересная, решение эффективное на скрине.

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

int main()
{
srand(time(NULL)); /* будем генерировать значения матрицы */
int N,M;
do
{
printf("Введите количество строк матрицы: ");
scanf("%d", &N);
} while (N < 1);
do
{
printf("Введите количество столбцов матрицы: ");
scanf("%d", &M);
} while (M < 1);
int ** A;
A = (int **) malloc(N * sizeof(int*));
for(int x = 0; x < N; x++)
A[x] = (int *) malloc(M * sizeof(int));

/* начинаем генерировать значения */
for(int x = 0; x < N; x++)
for(int y = 0; y < M; y++)
A[x][y] = rand() % 50 + 1;

/* выведем значения на экран */
for(int x = 0; x < N; x++)
{
for(int y = 0; y < M; y++)
printf("%d\t", A[x][y]);
putchar('\n');
}
putchar('\n');

int sum;
/* начинаем менять значения */
for(int x = N - 1; x >= 0; x--)
for(int y = M - 1; y >= 0; y--)
{
sum = 0;
for(int p = x; p >= 0; p--)
for(int q = y; q >= 0; q--)
sum += A[p][q];
A[x][y] = sum;
}

/* выведем значения на экран */
for(int x = 0; x < N; x++)
{
for(int y = 0; y < M; y++)
printf("%d\t", A[x][y]);
putchar('\n');
}
putchar('\n');

if(A != NULL)
{
for(int x = 0; x < N; x++)
{
if(A[x] != NULL)
{
free(A[x]);
A[x] = (int*) NULL;
}
else
{
printf("Ошибка при удалении элементов матрицы.");
exit(1);
}
}
free(A);
A = (int**) NULL;
}

return 0;
}
Валера Утюмов
Валера Утюмов
50 323