Loading...
AlexanderBeloev avatar AlexanderBeloev 70 Точки

15ти Проблем от 3то домашно - Решение до тук + въпрос.

Здравейте,

 

Исках да споделя обяснение на 15та задача. Написал съм малко по-подробно нещата за да може да е максимално разбираемо:

 

LINK

 

Исках да попитам следното. Понеже говорих с Наков относно задачата и той каза, че е по добре да се вземат трите стойности наведнъж и да се заместят. Дали някой знае как става? Array?

 

Иначе и горното решение работи, просто повторете кода три пъти за 3те размени и ще се получи.

 

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

 

P.S. - Пускам го в нова тема защото само така ще могат да го видят повече хора. Това е естеството на форумите. Който е бил в мега форуми като WarriorForum и подобни знае, че организацията е единствено и само по категории.

Тагове:
6
Programming Basics
svetli0o avatar svetli0o 134 Точки

Вместо да работиш с маска = 1 (00001), работиш с маска 7 (000111). По този начин взимаш и заместваш всички числа, а не ги местиш едно по едно :)

6
AlexanderBeloev avatar AlexanderBeloev 70 Точки

Благодаря ти!

 

Така сработи. Простичко, ама трябва някой да те светне. Мерси много! :)

1
AlexanderBeloev avatar AlexanderBeloev 70 Точки

Още едно въпросче,

 

Горепосоченото решение е валидно само за замяна на битове от един тип. Демек три 1ци с 3 нули или обратното. Но когато имаме различни битове, например 100 да се размени със 010, възможно ли е да стане наведнъз замяната?

 

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

0
svetli0o avatar svetli0o 134 Точки

Трябва да направиш зануляване на битовете, за това се получава така. Имам предвид че преди да кажеш на бит 24, 25 и 26 на колко искаш да са равни трябва да ги направиш 0 и след това като направиш ИЛИ ще ги запълниш както трябва. Незнам колко ясно го обясних :D

2
ybaltova avatar ybaltova 14 Точки

Хареса ми твоето решение, чисто и добре обяснено. Ако пробваш с по-голямо число, тип 4294901775 както е дадено в примерите, ще ти гръмне програмата. Може да използваш uint, за да се презастраховаш.

Това е моето решение: Линк

1
AlexanderBeloev avatar AlexanderBeloev 70 Точки

Благодаря ти за решението. Доста по различно е от моето и май доста по-грамотно :D

0
beBoss avatar beBoss 507 Точки

Тази задача май е от по-лесните, поне според мен и е един ред код. Иначе ми харесва идеята, как ти проверяваш за result24 == 1 обаче така трябва да направиш същото за останалите две позиции и става малко като повтаряне на код.

1
AlexanderBeloev avatar AlexanderBeloev 70 Точки

Здравей,

 

Дали можеш да споделиш решението си. Стана ми интересно как си я направил :)

 

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

1
beBoss avatar beBoss 507 Точки

Заповядай ЦЪК  :)

4
AlexanderBeloev avatar AlexanderBeloev 70 Точки

Последното ми решение е същото, но на 12 реда код. Ще го синтезирам малко сега.

 

Благодаря ти много! cool

0
ybaltova avatar ybaltova 14 Точки

Аз да се възползвам от темата на колегата и да помоля за малко помощ относно задача 16. Това е моето решение: Линк

Не ми се получава проверката с числото 4294901775. Аз получавам 4060020863 като резултат, вместо 4194238527 както е в условието. Останалите проверки сработват. Идеи къде бъркам?

1
HPetrov avatar HPetrov 822 Точки

p и q ги сложи в края на for loop-а, инъче например ти му задаваш да почва от 3та позиция и като влези в цикъла това 3 става 4 и дефакто започва от 1 позиция напред.

3
beBoss avatar beBoss 507 Точки

Да,

p++;
q++;

трябва да са най-отдолу.

1
ybaltova avatar ybaltova 14 Точки

Стана! Мерси и на двамата :)

1
kiko144 avatar kiko144 795 Точки

 Здравейте колеги, Ето и моето решение на 15-та задача Линк

1
svetli0o avatar svetli0o 134 Точки

Ето и моето решение, има и коментари. Пробвах да го напиша по ясно :) Линк

2
milen8204 avatar milen8204 296 Точки

Ето и моето решение използвал съм масиви, като превъртя стринговете в масив и заменя членовете 24, 25 и 26 с 3, 4 и 5 и използвам 3 временни променливи за размяната. Малко чийтърско ама нищо не ми дойде на акъла иначе работи.

П.С. Но, като разгледах вашите решения са по - хитри. :)

1
AlexanderBeloev avatar AlexanderBeloev 70 Точки

Здрасти Милен,

 

Разгледах решението ти. И аз бях написал доста реда код преди да стигна до моето последно решение, за което много ми помогна решението на 16та задача на "ybaltova" което е публикувано по-горе. Реших, че може да ти е полезно и го споделям :)

 

Ето линк към него:

 

LINK

 

Поздрави от от мен cool

1
milen8204 avatar milen8204 296 Точки

Да AlexanderBeloev благодаря ти много.

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

Успех от мен.

1
dim4o avatar dim4o 288 Точки

Здравей !

Харесва ми логиката на решението ти, на зад 16, но мисля, че можеш да го изчистиш още малко :)

Не съм убеден, че това работи коректно за всички случаи: else if ((numberQ - numberK) < (numberP + numberK)). Това е равносилно на numberQ - numberP < 2*numberK, което не го разбирам. Не вярвам да работи винаги коректно. Аз използвам |numberP - numberQ| <  numberK. (става въпрос за покриването на случая за overlapping)

Този номер със стринговете и цикъла, който правиш: strMask = strMask + "1"; според мен може да го спестиш просто с реда uint unit = (1u << numberK) - 1;. Нали се търси число от вида 11111..., така k пъти. Това всъщност е числото 2^k - 1, а 2^k e 1000..., което е: 1<<k. Ето и моето решение на зад 16.

1
ViValDam avatar ViValDam 15 Точки

  Всъщност, задача 15 е частен случай на задача 16, с  р = 3, q = 24 и k=3. 

Ето го моето решение на 15, а на 16 съм го пуснала в отделна тема за 16 задача.

под LEFT имам предвид бита с по голям номер на позицията , а RIGHT - този с по-малкият номер на позицията. 

class BitsExchange

{

     static void Main() 

    { 

         while (true) 

        { 

             Console.Write("Enter a number (Min value = 0, Max value = ");

             Console.WriteLine(uint.MaxValue + "):\n");

             string line = Console.ReadLine();

             uint number;

             bool result = uint.TryParse(line, out number); 

             if (result == false) //not a valid uint number 

             { 

                   Console.WriteLine("\nThis is not a valid value for number!\n\n");

             } 

             else  // the input is valid 

             {    

 

                   //swap 3 with 24, 4 with 25, 5 with 26 

                   // "Right"  I call  the bit with bigger position ( this are bits 24, 25,26) and  

                   // "Left"  the bit with smaller position ( this are bits 3, 4, 5 ) 

                   int LeftPosition = 24; 

                   int RightPosition = 3; 

                   int leftBit_Value ; 

                   int rightBit_Value ;

                   uint maskLeft;

                   uint maskRight;

                   for (int i = 0; i < 3; i++) 

                   {

                        //getting the values in the bits

                        maskLeft = 1u << LeftPosition;

                        leftBit_Value = (int)(number & maskLeft) >> LeftPosition;

                        maskRight = 1u << RightPosition;

                        rightBit_Value = (int)(number & maskRight) >> RightPosition;

 

                        //replacing Left with Right

                        if (rightBit_Value == 1) 

                        { 

                               // then we change the Left Bit Value to 1 

                               number = (uint)(number | maskLeft); 

                        } 

                        else if (rightBit_Value == 0) 

                        { 

                               // than we change the Left Bit Value to 0 

                               maskLeft = ~ maskLeft; 

                               number = (uint)(number & maskLeft);

                        } 

 

                       // replacing Right with Left 

                       if (leftBit_Value == 1) 

                       { 

                               // then we changing the Right Bit Value to 1 

                               number = (uint)(number | maskRight); 

                       } 

                       else if (leftBit_Value == 0) 

                       { 

                                // change the Right Bit Value to 0 

                                maskRight = ~ maskRight;

                                number = (uint)(number & maskRight);

                       } 

                                LeftPosition ++;

                                RightPosition ++;

                       } 

                       Console.WriteLine("\nResult : \n\n" + number + " \n\n\n"); 

                 } 

            } 

      } 

}

 

 

 

 

2
AlexanderBeloev avatar AlexanderBeloev 70 Точки

Здравей Вивал,

 

Първо, благодаря за споделянето на твоето решение. Тъй като така споделен код си губи структурата и дори поставен във Visual Studio излиза на един ред, можеш ли да го постнеш примерно тук и да споделиш линк към него:

 

http://pastebin.com/

 

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

 

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

1
scinetic avatar scinetic 40 Точки

Мъчих се 2 часа над тая задача и накрая естествено се оказа, че ми е грешно решението. anyway..

Въпроса ми е какво се случва когато  7 << 3

uint mask3 = 7 << 3;

От лекцията на Наков видях само, че когато е 1 << n и си пишем за n, кой бит по ред от дясно наляво искаме да заместим.

 

0
dim4o avatar dim4o 288 Точки

7 = 111 - в двоична бройна с-ма. и понеже работим с 32 битово число (uint) имаме: 00000000 00000000 00000000 00000111. 7<<3 измества всички битове на числото 7 с три знака наляво, т.е. 7<<3 = 00000000 00000000 00000000 00111000. Аналогично 7<<24 = 00000111 00000000 00000000 0000000, а (7 << 3) | (7 << 24) = 00000111 00000000 00000000 0111000, т.е получаваме число където всичко е 0 и имаме 1 само на позициите, които ни интересуват: 3, 4, 5, 24, 25, 25. Ако проследиш решението с конкретни стойности (примерно тези от теста) ще ти стане ясно всичко. Ето моето решение на задачата - зад15. Кратко, но логиката е заплетена. Ето едно друго решение, което не е токова кратко, но е с ясна логика. Просто взимаш битове запазваш и презаписваш. Комбинация от предните задачи. Надявам се тези кратки обяснения да са ти били полезни.

2
ViValDam avatar ViValDam 15 Точки

Форматирах кода на моето решение, по-нагоре , извинявам се smile.

 

За тези задачи с битовете , трябва да се разбере, че има в същност само три операции и стават после  много лесни !

 

1. Взимане (откриване)на стойността , която се намира вече в бита:

mask = 1 << Position;      // puting 1 under the bit in the given position

bitValue = number & mask >> LeftPosition;      // result 0 or 1

 

2. Вкарване в бита на стойност '1' (независимо от стойността , която вече е в него, дали е 0 или е 1):

number = number | mask;           // result 

                                               //new number = number * (2**position)  (if in bit was 0 before) 

                                               // new number = number (if in bit was 1) => No change occures !

 

3. Вкарване в бита на стойност '0' (пак  независимо от стойността , която вече е в него, дали е 0 или е 1) :

mask = ~ mask;                       

number = number & maskRight;   // result

                                                //new number = number / (2**position)  (if in the bit was 1 before) 

                                                // new number = number (if in bit was 0) => No change occures !      

 

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