Programming Basics\Arrays\Last K numbers Sum
Здравейте,
Реших всичко от лекцията, но тази задача "Last K numbers Sum" ми скъса нервите. Не мога да измисля сумирането. Някой би ли го обяснил ?
Здравейте,
Реших всичко от лекцията, но тази задача "Last K numbers Sum" ми скъса нервите. Не мога да измисля сумирането. Някой би ли го обяснил ?
Аз съм я написал с for цикъл, с който да достъпвам масива, и вложен while цикъл за събирането на последните k елемента (може и с for цикъл). Специфичното е, че във вложения цикъл имам проверка, за да не излезна от рамките на масива (IndexOutOfRangeException):
if (index - count < 0)
    break;
Count ми е броячът във вложения цикъл.
Защо не пробваш с един for - loop който да обхождаш масива отзад на пред?
Пример:
ulong sum = 0;
for(int i = arr.Length - 1; i >= arr.Length - K; i--)
{
sum += arr[i];
}
Успех
В крайна сметка се получи с налучкване. Иначе бях в правилната посока. Сега ще дебъгвам да разбера защо, но това долу работи коректно. Благодаря за подкрепата ! Бяха дълги 3 часа :)
 int n = int.Parse(Console.ReadLine());
            int k = int.Parse(Console.ReadLine());
             var array = new long[n];
                array[0] = 1;
            
            for (int current = 1; current < n; current++)
            {
                var start = Math.Max(0, current - k);
                var end = current - 1;
                long sum = 0;
                for (int i = start; i < n; i++ )
                {
                    sum +=array[i];
                }
array[current] = sum;
}
Console.WriteLine(string.Join(" ", array));
Лично за мен тази задачка не беше много на мястото си още в самото начало за масиви без да сме им свикнали. Като стигнах до нея и не успях да измисля какво се иска от нас, си виках леле мале, къде се намирам. Задачките след нея ми бяха доста по-лесни от тази.
За да ти даде пълните 100 точки направи си масива да ти е от тип long[] и сумата ти също да е от тип лонг, като след нулата добавиш задължително едно главно L, иначе ще стане int, а ако го добавиш това L, а оставиш масива int[] ще ти даде грешка заради несъвместимите типове. Ако сумата ти е ulong трябва да напишеш ulong sum = 0UL; ,но в такъв случай трябва и масива ти да е ulong, т.е. да не съдържа отрицателни числа, което не е изрично опоменато в условието и може да ти изгърми някой тест.
Ето тези два реда напиши вместо твоите и го пробвай така в judgeto.
long[] sequence = new long[n];
long sum = 0L;
class LastKNumbersSums
    {
        static List<long> sequence = new List<long>();
        static void AddToSequence(int numOfPrevious)
        {
            if(sequence.Count < numOfPrevious)
            {
                long sum = 0;
                foreach(long num in sequence)
                {
                    sum += num;
                }
                sequence.Add(sum);
            }
            else
            {
                long sum = 0;
                for(int i = sequence.Count-1; i >= sequence.Count-numOfPrevious; i--)
                {
                    sum += sequence[i];
                }
                sequence.Add(sum);
            }
        }
        static void Main(string[] args)
        {
            int n = int.Parse(Console.ReadLine());
            int k = int.Parse(Console.ReadLine());
            sequence.Add(1);
            for(int i = 0; sequence.Count < n; i++)
            {
                AddToSequence(k);
            }
            foreach(long num in sequence)
            {
                Console.Write(num + " ");
            }
        }
    }