[Homework] Java Basics - Syntax - Problem {8*} - Count of Equal Bit Pairs - грешка в условието
Здравейте!
Искам да Ви уведомя за грешка в примерите от Java Syntax Homework (September) на Problem 8. * Count of Equal Bit Pairs.
n | binary representation of n | count |
15 | 1111 | 3 |
5343 | 1010011011111 | 6 |
62241 | 1111001100100001 | 9 |
На пръв поглед можете да видите, че броя двойки 1-ци на първия пример е 2, а като брой резултат е даден 3, същото е и с другите примери. Ако темата се дублира, моля да ме извините, не можах да намеря подобна тема. :)
Битът на позиция 31 при типа int показва знака на числото. Ако ти подават положителни числа той винаги ще е 0. Това, което правиш, ще препълни int-a, неговата максимална стойност е 2^31 - 1.
По-безопасно е да вървиш отдясно наляво в while цикъл, да местиш числото надясно след като провериш дадена позиция и да спреш, когато числото стане 0. Така няма да има значение точно къде е първата единица. Има също начини да проверяваш по две числа едновременно, облекчава сметките.
Последния цикъл би трябвало да е не до 31, а до pos - 1, нали това е цялата идея на първия цикъл, да видиш къде да спреш. А може би си сложила 31, защото не ти работи изчисляването на pos? Но както казах, по-добре го смени с while (num > 0) примерно.
Последният цикъл не е (или поне според мен не е :) ) до 31, а до j. Задала съм му първоначална стойност 31, за да го инициализирам, но би трябвало да се запазни последната му стойност, при която е завъртян цикъла за проверка.
Честно казано, не разбрах точно идеята с местенето надясно докато числото стане 0. Как ще разберем по този начин коя е значимата позиция?
И още- ако се върнем на моя начин, значи ли, че ако задам цикъла не от 31, а от 30 ще се реши проблемът?
Аха, да, сега видях, че j е декларирана по-нагоре, стандартното е да се ползва само за цикъла и не го забелязах.
С while няма значение къде е последната единица - местиш числото надясно, лека-полека тази единица се придвижва надясно и самото число намалява (операцията >> 1 е аналогична на деление на 2). В един момент единицата ще дойде най-вдясно, след което ще изчезне и числото вече ще е нула. Тогава трябва да се спре цикъла, защото нататък следват само нули, които ще се преброят в брояча. Даже може да се спре цикъла една стъпка по-рано (на предпоследна стъпка примерно имаме число в двоична бройна система 001х, реално няма нужда да местим пак надясно, защото е ясно, че повече двойки битове няма - ще получим 0001 и на следващата стъпка вече 0). Т.е. може while (number > 1) да е условието, пак би трябвало да работи.
По твоят начин, би трябвало да проработи ако провериш първо 30-та позиция и вървиш наляво. Както казах, ако ти се подават само положителни числа тип int, това е последната позиция, на която може да имаме 1, ако на позиция 31 има 1, значи числото е отрицателно. Мисли за бит 31 като за знака на числото - 0 => "+", 1 => "-". А както повдигаш 2 на степен 31 и после обръщаш в int, това е по-голяма стойност от максималната му стойност. Смени 31 с 30 и виж дали става, вероятно ще се получи.
Супер, браво, много благодаря! Просветна ми :) Едно иф-че сложих (ако n стане нула, прекъсва цикъла) и се получи идеално. Пак много благодаря!