Другие языки программирования и технологии

Дан двумерный массив из NxM случайных элементов. Посчитать сумму периметра. С++

2александр: интересная идея, но ресурсоемкая, как мне сдается. надо взять на вооружение. благодарствую!
я соорудил конструкцию на циклах -

#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <conio.h>
using namespace std;

int main(void)
{
int tbl[100][100],n,m,s=0;
cout << "enter number of rows\n";
cin >> n;
cout << "enter number of columns\n";
cin >> m;
cout << "matrix\n";
srand((unsigned)time(NULL));
for(int i=0;i< n;i++)
{
for(int j=0;j< m;j++)
{
tbl[ i][ j]=rand()% 21-10;
cout << tbl[ i][ j] << " ";
}
cout << "\n";
}
for(int i=0;i< n;i++)
for(int j=0;j< m;j+=m< 2?1:m-1)
s+=tbl[ i][ j];
for(int i=0;i< n && m >2;i+=n< 2?1:n-1)
for(int j=1;j< m-1;j++)
s+=tbl[ i][ j];
cout << "perimeter sum=" << s;
getch();
return 0;
}

зы была б матрица квадратная - одним циклом можно было бы обойти весь периметр.
АС
Айрат Самирханов
20 328
Лучший ответ
считаем рекурсивно!
из суммы всех элементов массива вычитаем сумму элементов массива поменьше, получаемого выбрасыванием периметра.. . и так делее.. .
метод вычисления суммы элементов массива при этом будет вызываться рекурсивно.
вот так-то!
Лось, вот тебе с помощью одного цикла:

for(int j=0;j< n+m-2;j++)
if(j < n ) s+=tbl[ j][ 0]+tbl[ j ][ m-1];
else s+=tbl[ 0][ j-n+1]+tbl[ n-1 ][ j-n+1];

:)
Олег Кошевой
Олег Кошевой
76 473
Не нужна здесь рекурсия, так как сумму элементов массива придётся всего два раза вычислять:

#include <conio.h>
#include <iostream>
#include <iomanip>
using namespace std;

int BorderSum(int**, int, int, int, int);

int main() {
setlocale (LC_ALL,"Russian");
int** a;
int n, m, i, j;
cout << "Введите кол-во строк: ";
cin >> n;
cout << "Введите кол-во столбцов: ";
cin >> m;
cout << "Заданный массив: " << endl;
srand(time(NULL));
a = new int* [ n ];
for (i = 0; i < n; i++) {
a[ i ] = new int[ m ];
for (j = 0; j < m; j++) {
a[ i ] [ j ] = rand() % 101 - 50;
cout << setw(4) << a[ i ] [ j ]; }
cout << endl; }
cout << "Сумма элементов периметра: "
<< BorderSum(a, n, m, 0, 0) - BorderSum(a, n, m, 1, 1)
<< endl;
getch();
for (i = 0; i < n; i++)
delete [] a[ i ];
delete [] a;
return 0; }

int BorderSum(int** a, int n, int m, int di, int dj) {
int s = 0;
if (n > 2 * di && m > 2 * dj)
for (int i = di; i < n - di; i++)
for (int j = dj; j < m - dj; j++)
s += a[ i ] [ j ];
return s; }
Что такое массив? Что такое двумерный массив? Как обратиться к элементу массива?
Какие элементы массива лежат на периметре? Как посчитать сумму элементов строки, столбца?
Как то примерно так нужно подходить к решению. Данную тему только к самостоятельному изучению.
Алексей Ионов
Алексей Ионов
35 996
Решается через трёхмерный дискредитив двуполярного циклического реполиума!

Похожие вопросы