Софтуерно Инженерство
Loading...
chichovoto avatar chichovoto 31 Точки

Задача: пресичащи се редици

С познанията си до тук от курса се опитвам да реша следната задача: https://csharp-book.softuni.bg/chapter-09-problems-for-champions.html

https://pastebin.com/SD6U3Xxj    90/100 в джъдж

Бих искал да знам какво изпускам....

Не искам варианти на кодове с масив.

Благодаря!

 

0
Programming Basics with C#
Filkolev avatar Filkolev 4501 Точки
Best Answer

Грешна ти е проверката в цикъла, според условието трябва да търсиш числа до 1 000 000, но ти търсиш до 1 000 000 000.

Друг пропуск е, че след като провериш условието на цикъла смяташ новите числа, но след излизането от цикъла не проверяваш дали новите стойности (по-специално t4) са все още в допустимата граница.

С тези две корекции дава 100/100.

0
Iv_Konov avatar Iv_Konov 357 Точки

Привет,

 

Най-сетне стигнах до тази задача. Опитах се да я реша без да чета насоките във форума и учебника, и числовата спирала ме вкара в капан! 

 

В условието на задачата са ползвали примерна редица с първоначална стъпка за нарастване 2: 5, 7, 9, 13, 17, 23, 29, 37...

 

В резултат, моята логика ме заведе към грешното представяне на редицата, за което съдията награждава само с 30/100. Лесно се вижда, че двете представяния по-долу водят до примерната редица, но грешното работи само с примерната стъпка* - 2 - с всички други стъпки не работи...  Странното е, че всички примерни входове не виждат този проблем, 
т.е. минават коректно. Явно борбата, за да стигна до работещо решение, ме ядоса и накрая реших задачата и по втория вариант - с масиви. Е, борбата с масивите, дори и непозната материя, беше на пъти по-лека... :)

* Грешно представяне на редицата/стъпката - 2 + 0 -> 2 + 2 -> 4 + 2 -> 6 + 2:
spNext = sp1 + spStep;
sp1 = spNext;
spCtr++;
if (spCtr % 2 == 0)                   
{
   spStep += 2;

* Коректно представяне на редицата/стъпката - 2 * 1 -> 2 * 2 -> 2 * 3 -> 2 * 4:
spNext = sp1 + spStep * spPower;
sp1 = spNext;
spCtr++;
if (spCtr % 2 == 0)
{
   spPower++;
}

 

Поздрави,
Иван

0
06/03/2019 16:13:58
chichovoto avatar chichovoto 31 Точки

Много хубава задачка! Може би най-интересната от всички до тук. Да я реша без масив за мен си беше предизвикателство :)

А иначе, ползвайки твоите променливи, ето този код работи без проблем:

            int startStep = 2;
            int spStep = 0;
            int sp1 = 5;
            for (int spCtr = 1; spCtr <= 100; spCtr++)        //за 100 числа от редицата...  
            {
                if (spCtr % 2 == 0)
                {
                    spStep += startStep;
                }
                int spNext = sp1 + spStep;
                sp1 = spNext;
                Console.Write(spNext + " ");
            }

Случайно да не забравяш да променяш стъпката тук: spStep += 2  и за това да имаш някакви проблеми....

0
Iv_Konov avatar Iv_Konov 357 Точки

Здравей,

 

Благодаря за обратната връзка.

 

Да, задачата е готина! Много разсъждения, много анализ...

 

Относно проблема, в който влезнах... Явно не съм се изразил съвсем коректно, и не си ме разбрал... 
Твоята доработка работи, т.е. изчислява коректно редицата, но не визуализира моя проблем. 

 

Допълнителни обяснения за моя "капан", в който влезнах.
* Независимо от първоначалната стъпка spStep, аз добавям винаги "2"! За примерната редица - 5, 7, 9, 13, 17, 23, 29, 37 (spStep = 2 и sp1 = 5) - работи коректно, но разбира се, само за този вариант! Реално не съм се сетил, че увеличението на стъпката на редицата е свързано с първоначалната стъпка spStep. 
Нямаше да влезна в този капан, ако имаше пример за редицата и с друга стъпка (1, 3 или която и да е друга)...

 

Грешен вариант:
int spStep = 2;
int sp1 = 5;
Console.Write(sp1 + " ");
for (int spCtr = 1; spCtr < 100; spCtr++)   //за 100 числа от редицата...  
{                
   int spNext = sp1 + spStep;
   sp1 = spNext;
   if (spCtr % 2 == 0)
   {
     spStep += 2;        // * точно тук е критичният момент на моята грешка в първоначалните разсъждения 
   }
Console.Write(spNext + " ");
}

 

Реално, задачата я реших накрая (след доста часове безрезултатна борба), но я реших, след като прочетох допълнителните инструкци, че идеята на спиралата е, че стъпката на увеличението не е винаги "2", а стъпката е равна на въведената стойност за spStep. 
И чак след това се амбицирах и реших задачата с масивите (при мен кодът е няколко реда по-къс), т.е. имам две решения на задачата - 1. със знания от обучението и 2. с масивите.

 

В работещото си решение ползвах подобен вариант на твоята доработка:

int spPower = 0;
int spStep = 2;
int sp1 = 5;
for (int spCtr = 1; spCtr <= 100; spCtr++)                       //за 100 числа от редицата...  
{
  if (spCtr % 2 == 0)
  {
     spPower++;
  }
int spNext = sp1 + spStep * spPower;
sp1 = spNext;
Console.Write(spNext + " ");
}


Поздрави,
Иван :)

0
07/03/2019 13:23:52