Loading...
d3vildog avatar d3vildog 58 Точки

[Exam Problems] C# Basics - Въпрос по задача {4} Crossing Sequences (11 Април Вечерта)

Здравейте,

 Не разбирам от условието как се намират спиралните числа, числата на трибоначи са ясни, но явно аз не мога да видя каква точно е формулата по тази стъпка която даваме за спиралните числа смисал :

Also, let the number spiral start with 5 and have a step of 2; it then contains he numbers 5, 7, 9, 13, 17, 23, 29, 37, etc. Since 37 is the first number that is both in the Tribonacci sequence and in the spiral, it is the answer.

даден е пример но не е обяснено как точно става, предполагам е доста лесно, но аз не мога да го схвана ако някой може да обясни ще съм му много благодарен smile

Тагове:
1
Programming Basics
boyanov avatar boyanov 65 Точки

spiralStart += spiralStep;
if (counter % 2 == 0)

{
spiralStep += 2;
}
counter++;

Този код го слагаш в един цикъл и на всяко завъртане прибавяш стъпката към числото, на всяко второ завъртане стъпката се увеличава с 2. По този начин вземаш само числата, които са на ъглите.

1
nikola.m.nikolov avatar nikola.m.nikolov 830 Точки

Гледайки примера с дадената спирала то спиралата започва от средата с startNum = 5 и стъпката на спиралата е step = 2. Ако обърнеш внимание на числата в ъглите, то те са  5 (startNum), 7, 9, 13, 17, 23, 29, 37 и т.н. Логиката на тези числа е:

  • Използвам променлива power = 1. Два пъти събираме startNum със step * power чрез формулата: startNum += step * power;    При първото изпълнение имаме  5 += 2 * 1 и резултата е 7. При второто изпълнение имаме 7 += 2 * 1 и резултата е 9
  • Тук увеличавам power++ и става = 2. И отново изпълнявам 2 пъти формулата startNum += step * power; При първото изпълнение 9 += 2 * 2 и резултата е 13. При второто изпълнение 13+= 2 * 2 и резултат 17.
  • При всяка следваща стъпка повтаряме логиката от предните стъпки....

 

Единият начин да проверяваш дали е време да увеличиш power++ е както е показал boyanov чрез counter++ и проверка дали if (counter % 2 == 0). Аз го направих като инициализирах в началото булева променлива increasePower = false. След като изпълня 1 път формулата от предните стъпки startNum += step * power проверявам:

if (increasePower)
{
    power++;
}

след което обръщам стойността:

increasePower = !increasePower;

 

Обяснението ми може да го видиш реализирано: CrossingSequences

 

 

3
d3vildog avatar d3vildog 58 Точки

Да разбрах го много благодаря за подробното обяснение tongue-out

0
yankozlatanov avatar yankozlatanov 10 Точки

Здравейте колеги,

Като начинаещ реших да се пробвам на тази задача, но стигнах само до тука : http://pastebin.com/WDtnN1LU

Успях да направя така че да принтирам поредицата от числата. 

Сега ми остава само да намеря кога се засичат и колко пъти да се върти всеки for цикъл :P .

Моля за някаква насока как да стане това, със array и foreach или има друг метод ?

Благодаря Ви предварително !

0
16/11/2014 09:52:15
Filkolev avatar Filkolev 4482 Точки

Ако предположим, че алгоритмите ти за намиране на двете поредици са верни (а доколкото на пръв поглед виждам са), може да ползваш два списъка, в които да ги пълниш. Разгледай как се ползва List. След това е сравнително лесно, вървиш по единия списък и спираш щом засечеш елемент, който го има и в другия. Аз лично така реших задачата, не е най-доброто сигурно, но работи.

По-ефикасният начин, за който се сещам, но и по-трудният за осмисляне, е да увеличаваш двете редици и да спреш, когато намериш първия общ елемент. Пипкаво е, защото не ги увеличаваш едновременно редиците, а една след друга според някакви условия.

1
yankozlatanov avatar yankozlatanov 10 Точки

Мерси за идеите :)

Ще опитам първо с list и после може да си поиграя с увеличаване на  циклите.

0
GalyaGeorgieva avatar GalyaGeorgieva 88 Точки

Скъсах си нервите и не мога да намеря къде ми са тези 9 точки до 100. Въпросът вече е на чест :)
Ще може ли някой да ми погледне кода ТУК.

0
nasko_y avatar nasko_y 5 Точки

Числата от спиралата нарастват като се събират с число, което е равно на произведението от стъпката и число-брояч, като броячът на всяко второ следващо число нараства с единица (т. е. стойностите на брояча в началото ще бъдат 1, 1, 2, 2, 3, 3, 4, 4, 5, 5... и т. н.). В случая, ако началното число е 5 и стъпката е 2, следващото число ще бъде 7 (= 5 + 2 * 1), следващото 9 (= 7 + 2 * 1) и т. н.: 13 (= 9 + 2 * 2), 17 (= 13 + 2 * 2), 23 (= 17 + 2 * 3), 29 (= 23 + 2 * 3)... 

Ето един примерен вариант за извеждане на числата от спиралата със стойност максимум до 1 000 000.

...............

static void Main(string[] args)
{
    int spi = 0;
    int spi1 = int.Parse(Console.ReadLine());
    int spi2 = int.Parse(Console.ReadLine());
    for (int j = 1; j <= 1000; j++)
    {
        for (int k = 1; k <= 2; k++)
        {
            if (spi1 > 1000000)
            {
                break;
            }
            Console.Write(spi1 + " ");
            spi = spi1 + j * spi2;
            spi1 = spi;
        }
    }
}

Иначе моят вариант за конкретната задача е този: https://pastebin.com/sW6sx49j

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