Member 11031424 Ответов: 3

Суммируйте и разделите массив вот так.


arr[]={1,3,2,4,6,7,8,9,10, 11,12,16,5,8,7,8,4,6, 8,9,10, 11,12,16,2,4, 5};
split=2; // этот arr[] будем делить на 2 (без разбиений) части каждую с равными элементами split=1,2,3...n
skip=2; // skip-это не тот элемент, который нужно пропустить. skip=1,2,3...n размер res[] должно быть соответственно.
group=3 // варьируются между 1,2,3..n
затем
res[0]=15 //1+4+8
res[1]=18//3+6+9
res[2]=19 //2+7+10
res[3]=24 //11+5+8
res[4]= 24 //12+8+4
res[5]= 29//16+7+6
res[6]=21 //8+11+2
res[7]=25 //9+12+4
res[8]=31 //10+16+5

и как мудрое разделение может быть от 1 до n.
arr[]={1,2,3...n} элементы

Что я уже пробовал:

int[] arr = { 1,3,2,4,6,7,8,9,10, 11,12,16,5,8,7,8,4,6, 8,9,10, 11,12,16,2,4, 5};
            int split = 2;
            int counter = arr.Length / (split);
            int skip = 2;
            int gor = 3;
            int len = arr.Length / gor;
            //int g1 = gor - 1;
            int[] tempArr = new int[counter];
            for (int idx = 0; idx < counter; idx++)
            {
                int sum = 0;
                int cn = 0;
                for (int i = idx; i < arr.Length; i = i + skip + 1)
                {
                    if (cn == gor)
                    {
                        break;

                    }
                    else
                    {
                        sum += arr[i];
                        cn++;
                    }
                }
                tempArr[idx] = sum;
            }


            for (int i = 0; i < tempArr.Length; i++)
            {
                MessageBox.Show(tempArr[i].ToString());
            }
        }
Он дает первые три правильных, другие дают неправильные.

Maciej Los

Вы должны использовать отладчик, чтобы выяснить, где вы допустили ошибку в своем коде.

Kornfeld Eliyahu Peter

Ваше описание проблемы неясно, образец ввода и объяснение не вписываются в образец вывода по какой-либо логике...
1. разделение ... ну и что, если число элементов нечетное? Что нам делать с теми частями, которые у нас есть?
2. пропустить ... бегать линейно и пропускать некоторые элементы... Ладно... и что потом?
3. группа... вы имеете в виду сумму?

Simon_Whale

вы уже задавали этот вопрос вчера. как частичное решение было дано вам https://www.codeproject.com/Questions/1161820/Please-help-me-to-do-this-sum-and-split-array-like

3 Ответов

Рейтинг:
2

Patrice T

Как я понимаю, именно так и должен быть сделан раскол:

{1,3,2,4,6,7,8,9,10,11,12,16,5,8,7,8,4,6,8,9,10,11,12,16,2,4,5}
 0 1 2 0 1 2 0 1  2  3  4  5 3 4 5 3 4 5 6 7  8  6  7  8 6 7 8

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

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

Отладчик-Википедия, свободная энциклопедия[^]
Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]

Отладчик здесь для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.


Рейтинг:
1

OriginalGriff

Если вы не уверены, что происходит, то декомпилируйте свое программное обеспечение: напишите метод, который разбивает ваш входной массив:

private static int[] Split(int[] inp, int blocks = 2, int blockno = 0)
    {
    int len = inp.Length / blocks;
    int[] result = new int[len];
    int blockstart = blockno * len;
    for (int i = 0; i < len; i++)
        {
        result[i] = inp[blockstart + i];
        }
    return result;
    }

Затем напишите метод, который пропускает элементы - он будет похож на Split, но он будет пропускать элементы при создании нового массива:
private static int[] Skip(int[] inp, int count = 0)
    {
    ...
    return result;
    }
Затем один, чтобы сгруппировать их:
private static int[] Group(int[] inp, int count = 2)
    {
    ...
    return result;
    }
Таким образом, вы не пытаетесь сделать сложную операцию за один раз - это не так эффективно, как один метод, чтобы сделать все это, но это намного, намного проще понять - и это означает, что это также, вероятно, намного надежнее! Это также намного, намного проще проверить, потому что на каждом этапе вы используете результаты предыдущих, проверенных операций.

Но это твое домашнее задание, так что я не буду писать его за тебя!


Maciej Los

+5!

Рейтинг:
1

Maciej Los

Шаги, которые нужно сделать:


  1. Разбейте массив на целевое число массивов (позже называемых подмассивами). В этом случае вы должны получить три 9-элементных подмассива
  2. Циклически перебирайте данные каждого подмассива и группируйте данные, используя модуль счетчика и количество последовательных чисел для пропуска
  3. Вычислите сумму для каждой группы


Решение Linq:
int[] arr = new int[]{1,3,2,4,6,7,8,9,10,11,12,16,5,8,7,8,4,6,8,9,10,11,12,16,2,4,5};
int ConsecutiveNoToSkip = 2;
int NoOfGroups = 3;
int ItemsInGroup = arr.Length/NoOfGroups;

for(int i=0; i<NoOfGroups; i++)
{
	var grp = arr.Skip(ItemsInGroup*i)
			.Take(ItemsInGroup)
			.Select((x, counter) => new
			{
				Number=x,
				Counter=counter,
				GrpNo=counter%(ConsecutiveNoToSkip+1)
			})
			.GroupBy(x=>x.GrpNo)
			.Select(g=>new
			{
				Numbers = String.Join("+", g.Select(x=>x.Number)),
				Result = g.Sum(y=>y.Number)
			});
	//here you can display the data
}


Результат:
подмассив №1
Numbers Result
1+4+8   13 //not 15!
3+6+9   18 
2+7+10  19 


подмассив №2
Numbers Result
11+5+8  24 
12+8+4  24 
16+7+6  29 


подмассив №3
Numbers Result
8+11+2  21 
9+12+4  25 
10+16+5 31