Loops Homework 2015


9

Да си има и за него тема, че ще се разсърди. :)

Пускам моите решения и чакам други гледни точки.

Естествено, темата е и за обсъждане на задачите, не само да си мерим... кода. :)




Отговори



10

Разгледах решенията, като загледах по-подробно решенията ви за превръщане на двоично число в десетично.

Ползвайте по-активно наученото досега... :)

Примерно индексатор на стринг ([i]) връща ... char. А char-а има "двуличност" - хем е буквичка, хем можеш да извършваш математически операции с нея, по-точно с unicode стойността й. '1'-48 e съвсем приемливо от гледна точка на компилатора, и може да се ползва в математически операции като числото 1.

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

Ето примерно едно мое решение:

        string input = Console.ReadLine();
        int result = 0;
        for (int i = 0; i < input.Length; i++)
        {
            result = (result << 1) + (input[i] == '1' ? 1 : 0);
        }

Сега ... result <<1 може да го напишете като result * 2, вече е въпрос на вкус, но точно сега извършвате побитови преобразувания, така че първия вариант за мен е по-четим, по се връзва в темата... Math.Pow е як overkill, когато го ползвате да повдигате цяло число на цяла степен.


от JulianG (5316 точки)


8

Привет,

това са творенията ми по темата заЦикли :D

За спиралата все още не съм стигнал до културно решение, но до няколко дни ще я има и нея.


от BoyanTodorov (853 точки)


5

@Dentia Здравей на задачата за деление на факториел може да се един цикъл от К+1 до <=N, за да се избегне смятането на 2 факториела.

Поздрави


от BoyanTodorov (853 точки)

2

Дам, найс :)


от dentia (12519 точки)



5

Ето моето направих всичките Phew !!!: Click Me !

Сега само решавам задачи за изпита :D Ако някои иска да гледа задачи и друи неща : Super Ultra Mega Giga Tera secret exam tasks from old years




2

Здравейте,

Ето какво измислих аз.

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

Някой да знае как да я разширя?


от decho.D (120 точки)


1

Здрасти,

можеш да ползваш Console.SetBufferSize да й зададеш размер

и Console.SetWindowSize да оразмериш прозореца.


от BoyanTodorov (853 точки)

0

Огромно благодаря за споделянето! Измъчи ме тая задача, до последно не можах да я измъдря, но вариантът ти с масива е страхотен и много ми помогна да я подкарам!!! Как се сети за k и loops?!

P.S. ако си направиш параметрите на Write-a {0, 4} най-вероятно ще влезе, поне до лимита за задачата 20. Така при 20 числа губиш 20 позиции на ред :D




4

Здравейте,

Да споделя и аз моите решения Тук. На 18 задача при пресмятане на Факториела  при големи числа изчислява около 1 минута. При вас също ли се бави, ако ползвате метод с пресмятане на Факториел. Вярно зависи и от компютъра.


от tddold (429 точки)


3

Можеш да ползваш малка оптимизация. Ако помислиш малко и си разпишеш на хартийка (или в мозъка си :) ) какво трябва да се прави ще достигнеш и сам до идеята. Но все пак:

Ако имаш 5! / 3! трябва да изчислиш (1*2*3*4*5)/(1*2*3), нали така? Но ... 1*2*3 се явява и в числителя и в знаменателя, частното ще е 1. Така че теб ти трябва да сметнеш само 4*5. По тази логика без да смяташ факториели можеш наум да изчислиш, че 100! / 99! ще е равно на 100 :)

А, да... при работа с BigInteger (и Decimal) процесора смята "по бабешката", точно както човек смята на лист хартия. За разлика от другите типове числови данни, където математическите операции са реализирани на ниво "процесор", хардуерно. Така че производителността пада не в пъти, а в порядъци. Работата с такива типове данни трябва да се избягва, освен ако нямаме наистина основателна причина за ползването им.

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

Ако ползваш оптимизацията, за която ти писах по-горе може дори да се окаже, че не ти трябва BigInteger - числата с които ще работиш няма да стават толкова големи...


от JulianG (5316 точки)

3

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

Уловката на 18 задача е, че всъщност не трябва да смяташ голям факториел. Теб те интересува само и единствено броя на нулите от факториела. Това става чрез формула, която можеш да видиш тук;

А ето и моето решение за 18 задача ползвайки именно тази формула.





1

Здравейте,

Условието на задача 2 

Problem 2. Numbers Not Divisible by 3 and 7

  • Write a program that enters from the console a positive integer n and prints all the numbers from 1 to n not divisible by 3 and 7, on a single line, separated by a space.

според мен трябва да е "divisible by 3 OR 7", а не "3 and 7", за да се получи желаният Output. Както е в момента условието, трябва да се печатат всички, които не се делят на 21. Направил съм го да печата търсения в примера output, но все пак реших да попитам и вие как разбирате задачата.


от topalkata (6442 точки)


1
Малко ми беше странно и на мен условието, написах я набързо без да видя output-а и ми пропускаше само делимите на 21. Като се замисля най-точно би било "not divisible by 3 and not divisible by 7". Трябва да  свикнем с не дотам добра формулировка на проблема, предполагам че и с евентуални клиенти ще има неясноти. 

от decho.D (120 точки)

1

Да определено е подвеждащо но после логиката на самата задача те вкарва в правия път :) 

Според мен е написано така заради синтаксиса на изречението


от lubo_raykov (107 точки)


0

18 задача ми се стори доста интересна, мислех да взимам всяка последна цифра като деля с % 10, докато тя е 0 и да се брой в counter, после реших да превърна factorial в string и да го обходя от дясно на ляво и докато цифрата е 0 да добавя в counter. 

Ето и решението ми!


от kristian.face (871 точки)


3

И двата метода са доста бавни що се отнася до факториели на по-големи числа. Най-бързият начин е ТОЗИ :)

Едит:

относно твоя код - нямаш нужда от while във for-a. Можеш да напишеш проверката направо в тялото на for-a и ще работи по същия начин. :)


от dentia (12519 точки)

1
Изобщо не ми е идвал като идея да потърся из интернет някакъв алгоритъм за търсене на нули във factorial. Просто започнах да я решавам по условие. Благодаря ти за бързият отговор!

от kristian.face (871 точки)


0

от topalkata (6442 точки)


0

Колеги ето и моите решения.

GitHub


от TodorDimitrov (757 точки)


2

Гледам задача 12 - отпечатване на числа в разбъркан ред.

Там правиш следното: генерираш случайно число и проверяваш дали вече не си го извеждал като резултат. При 10-20 числа този подход е ОК, но при по-големи (примерно 1 млн) числа ще имаш проблем към края... когато си използвал 999 990 числа вероятността да се генерира число, което не е било вече генерирано ще е ... 0.001%. Ще зависнеш много яко.

По-добрата стратегия е да напълниш list-а с числата от 1 до колкото ще изкарваш на екрана, и да генерираш индекс на следващото число, което ще извеждаш. В началото ще имаш 1 млн числа, и ще генерираш случайно число между 1 и 1 млн. Което число улучиш - триеш го от list-а. В следващото минаване на цикъла ще генерираш случайно число между 1 и 999 999... Накрая ще генерираш число между 1 и 10, между 1 и 9, между 1 и 8 .... Така винаги ще имаш "печелившо" число, което не е теглено.

Идеята надявам я схвана - да избираш случайно число само от тези, които още не са излизали, а не да генерираш случайно число и след това да гледаш дали вече не е излизало.

Другия вариант е да генерираш ПОЗИЦИЯ, на която да вмъкнеш числото. Взимаш числото 1, генерираш позиция между 1 и 1. След това взимаш 2, и генерираш случайна позиция между 1 и 2, така че възможните варианти ще са 1,2 или 2,1, След това взимаш 3 и генерираш случайна позиция между 1 и 3 - така 3-ката ще се постави някъде, може отпред, може по средата, може и най-отзад. И така минаваш цялата поредица, като работиш с числата от 1 до N последователно, но всеки път генерираш случайна позиция, на която да се вмъкне даденото число.


от JulianG (5316 точки)

0
Прав си.Съгласих се.

от TodorDimitrov (757 точки)



0

Ето и от мен нещичко:

https://github.com/VladimirDimov/Loops---homework

Дано съм полезен.


от vladko_sz (195 точки)


0
Затруднявам се с разбирането на задачите с формулите от 5 до 8. Някой би ли ми обяснил точно какво се цели в задачите. Благодаря :) !!

от NorthMania (97 точки)


1

Здравей!

4. Дефинираш си например 1 стрингов масив и 1 масив от чарове по този начин:

string[] cardFaces = {"2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"};

char[] cardSuits = { '\u2663', '\u2666', '\u2665', '\u2660' };

С 2 вложени цикъла обхождаш cardFaces & cardSuits, принтирайки ги като чифт.

5. - 8. Най-важното за тези задачи е да използваш алгоритъм, който ти изчислява факториела на дадено число. Аз съм използвал рекурсивен метод (метод, който извиква себе си):

static int Factorial(int i)

{

if (i <= 1) return 1;

return i * Factorial(i - 1);}

Останалото е лесно, просто принтираш с един цикъл желания expression. 


от lnikod4s (6538 точки)

0
Четвърта ми е ясна обърках се че от там почваха формулите ;d. Значи се търси факториел на дадени числа ?

от NorthMania (97 точки)