Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.95/21: Рейтинг темы: голосов - 21, средняя оценка - 4.95
15 / 4 / 2
Регистрация: 01.12.2010
Сообщений: 157
1

Посчитать сумму периметра двумерного массива?

02.09.2015, 20:28. Показов 4208. Ответов 14
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
пытаюсь посчитать сумму двумерного массива , решить задачу смог, но хотелось бы получить совет сообщества.

какой будет более правильный и красивый алгоритм из приведенных изображений которые приложил, а так же рад буду получить и другой предложенный алгоритм.

первое изображение это мое решение , а для двух других я еще не решил , что-то не получается написать сам код.

если кого не затруднит помочь во втором и третьем решении, как показано на изображении sum2, sum3?

спасибо .

* matsum.png - это мое решение, и мне кажется что есть еще лучше.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
static int PrintAround(int[,] m)
    {
        int sum = 0;
 
        for (int i = 0; i < m.GetLength(0); i++)
        {
            for (int j = 0; j < m.GetLength(1); j++)
            {
                if (i == 0 || j == 0)
                {
                    sum += m[i, j];
                }
                else
                {
                    sum = sum + m[i, m.GetLength(0) - 1] + m[m.GetLength(1) - 1, j];
 
                    if (i == 4 && j == 4)
                        sum = sum - m[i, j];
 
                    i++;
                }
            }
        }
 
        return sum;
    }
Миниатюры
Посчитать сумму периметра двумерного массива?   Посчитать сумму периметра двумерного массива?   Посчитать сумму периметра двумерного массива?  

0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.09.2015, 20:28
Ответы с готовыми решениями:

Посчитать сумму столбцов двумерного массива
Вся задача в описании:)

Посчитать сумму каждой строки двумерного массива и вывести номер наибольшей
Дан двумерный массив размером n на m состоящий из цифр. Нужно посчитать сумму каждой строки и...

Как посчитать сумму четных и нечетных значений элементов двумерного массива?
Как посчитать сумму четных и нечетных значений элементов двумерного массива? Заранее Спасибо!)

Посчитать сумму элементов каждой диагонали двумерного массива, параллельной побочной диагонали
Здравствуйте уважаемые пользователи форума. Помогите пожалуйста с решением задачи по C#: &quot;Дана...

14
Заблокирован
02.09.2015, 21:02 2
Morris, 4 простых цикла. Тогда не будет вложенности.
1
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
02.09.2015, 21:51 3
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
static int SumAround(int[,] m)
{
    int sumleft = 0, sumtop = 0, sumbot = 0, sumright = 0;
    int height = m.GetLength(0), width = m.GetLength(1);
    for (int i = 0; i < width; i++)
        sumtop += m[0, i];
    for (int i = 0; i < width; i++)
        sumbot += m[height - 1, i];
    for (int i = 1; i < height - 1; i++)
    {
        sumleft += m[i, 0];
        sumright += m[i, width - 1];
    }
    return sumleft + sumtop + sumbot + sumright;
}
Если забить на производительность и кэши можно написать чуть короче.

Добавлено через 2 минуты
4 переменных сделано именно в угоду производительности Процессор видит, что переменные взаимно несвязанны и поэтому может применить распараллеливание на уровне команд
1
Заблокирован
02.09.2015, 21:54 4
Цитата Сообщение от Psilon Посмотреть сообщение
C#
1
2
3
4
for (int i = 0; i < width; i++)
     sumtop += m[0, i];
for (int i = 0; i < width; i++)
     sumbot += m[height - 1, i];
=>
C#
1
2
3
4
5
for (int i = 0; i < width; i++)
{
     sumtop += m[0, i];
     sumbot += m[height - 1, i];
}
1
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
02.09.2015, 22:02 5
Ev_Hyper, а тут если так сделать будут прыжки между данными и куча кэш-промахов, тогда как сумма выровненных данных последовательно будет выполняться намного быстрее Это тоже неслучайно.
2
Эксперт .NETАвтор FAQ
10410 / 5140 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
02.09.2015, 22:04 6
Цитата Сообщение от Psilon Посмотреть сообщение
в угоду производительности
Тогда уж:
C#
1
2
3
for (int i = 0; i < width; i++)
=>
for (int i = width - 1; i >= 0 ; i--)
1
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
02.09.2015, 22:17 7
Storm23, опять же, кэш читается линией вперед, а не назад, поэтому тоже будут промахи. Константу которая не меняется в цикле JIT оптимизирует (особенно если это будет x64, а не кривой рюджит или х86).

Добавлено через 10 минут
Фигню сказал. Читается та кэш-линия, в которую попадает элемент массива, так что разницы не будет по скорости от прохода вперед или назад. Но остальное в силе - компилятор x64 даже циклы разматывать умеет, не то, что константу заинлайнить
1
TheGreatCornholio
1254 / 732 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
02.09.2015, 22:18 8
3-й вариант.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace massiv
{
    class Program
    {
        static void Main(string[] args)
        {
            int[][] mas = { new int[5] { 2, 3, 4, 5, 6 }, new int[5] { 2, 3, 4, 5, 6 }, new int[5] { 2, 3, 4, 5, 6 }, new int[5] { 2, 3, 4, 5, 6 }, new int[5] { 2, 3, 4, 5, 6 } };
 
            for (int i = 0; i < mas.Length;i++)
            {
 
                for (int j = 0; j < mas.Length; j++)
                {
 
                    Console.Write(mas[i][j]);
 
                }
                Console.WriteLine();
 
            }
 
            int first = mas[0].Sum();
            
            int median = 0;
            for (int i = 1; i < mas.Length - 1; i++) median += mas[i][0] + mas[i][mas[i].Length - 1];
 
            int last = mas[mas.Length-1].Sum();
            
 
            Console.WriteLine(first);
            Console.WriteLine(median);
            Console.WriteLine(last);
            Console.WriteLine(first + median + last);
            Console.ReadKey();
 
 
        }
    }
}
1
Ev_Hyper
02.09.2015, 22:50
  #9

Не по теме:


Цитата Сообщение от Psilon Посмотреть сообщение
Ev_Hyper, а тут если так сделать будут прыжки между данными и куча кэш-промахов, тогда как сумма выровненных данных последовательно будет выполняться намного быстрее Это тоже неслучайно.
действительно, неподумавши написал.

0
TheGreatCornholio
1254 / 732 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
02.09.2015, 22:52 10
Можно одной строкой, но скорей всего, не нужно.

C#
1
2
3
4
            int height = mas.Length - 1;
            int width = mas[0].Length - 1;
            int summa = 0;
            for (int i = 0; i <= height; i++) summa += i == 0 || i == height ? mas[i].Sum() : mas[i][0] + mas[i][width];
1
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
02.09.2015, 23:02 11
Woldemar89, ну это чит, т.к. это не двумерный массив, а массив массивов С ними еще работать неудобно.
1
TheGreatCornholio
1254 / 732 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
02.09.2015, 23:12 12
Цитата Сообщение от Psilon Посмотреть сообщение
ну это чит
Ну, получается, да Я просто задачу по картинке решал, а не по формулировке
1
15 / 4 / 2
Регистрация: 01.12.2010
Сообщений: 157
02.09.2015, 23:32  [ТС] 13
)), столько много ответов, спасибо всем !!!
0
0 / 0 / 0
Регистрация: 04.02.2017
Сообщений: 6
25.12.2019, 23:06 14
можно использовать вот такой вариант, если хочется обойтись одним циклом
Java
1
2
3
4
5
6
7
8
9
10
int[][] array = fill(n, 10);
        print(array);
 
        int[] bigArray = new int[n*4];
        for (int i=0; i<n; i++){
            bigArray[i] = array[0][i];
            bigArray[i+n] = array[i][n-1];
            bigArray[i+2*n] = array[n-1][(n-1)-i];
            bigArray[i+3*n] = array[(n-1)-i][0];
        }
0
3560 / 2501 / 1174
Регистрация: 14.08.2016
Сообщений: 8,206
26.12.2019, 01:03 15
kurdalagon, какое отношения жаба имеет к шарпу?
0
26.12.2019, 01:03
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.12.2019, 01:03
Помогаю со студенческими работами здесь

Посчитать сумму элеметов периметра массива,что не так?
#include &lt;iostream&gt; #include &lt;stdlib.h&gt; #include &lt;time.h&gt; #define maximum 100 using...

Посчитать сумму двумерного массива
Хочу посчитать сумму двумерного массива путём += int A; A = StrToInt (Edit1-&gt;Text);...

Посчитать сумму элементов двумерного массива
Элементы матрицы заполнить случайными числами в диапазоне от 3 до 8. Посчитать сумму элементов...

Посчитать сумму элементов, находящихся в чётных строках двумерного массива
Доброго времени суток! Имеется некий код на C, который, к сожалению работает не правильно. А...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru