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 + " ");
}
}
}