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 4482 Точки
Best Answer

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

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

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

0
Iv_Konov avatar Iv_Konov 383 Точки

Привет,

 

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

 

В условието на задачата са ползвали примерна редица с първоначална стъпка за нарастване 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 383 Точки

Здравей,

 

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

 

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

 

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

 

Допълнителни обяснения за моя "капан", в който влезнах.
* Независимо от първоначалната стъпка 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
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.