Професионална програма
Loading...
antonp1p2 avatar antonp1p2 17 Точки

[Homework] Programming Basics - Operators Expressions and Statements - Problem {20} - Bits Up

Здравейте, имам явно някакъв проблем с задачата. Гледах решения на колеги, но нито едно не съвпада с моето. Ето и кода ми тук.

Проблемът е че така написана програмата работи идеално ако задам стойност на "n"  2 , но ако задам по-голяма стойност се губи някъде из кода и не променя битовете, които трябва.

Някой ако може да ми каже къде съм сбъркал ще съм му много благодарен.

1
Programming Basics 27/03/2015 10:18:06
GalyaGeorgieva avatar GalyaGeorgieva 88 Точки

Моето решение е доста кратко, но също работи.

Аз използвам два вложени цикъла. С първия "въртя" числата, а с втория "въртя" битовете. Логиката е: имам брояч на всички битове на всички числа (n*8) и ако бит-ът е == 1 или 1+step, 1+2*step  и т.н. (брояч % 2 ==1) да се превърне в 1. "Закачката" е, че вторият цикъл брои наобратно, т.е. от 7 до 0 и така знам позицията, която да "ударя" с единица.

Кодът можете да видите  ТУК

3
KatyaMarincheva avatar KatyaMarincheva 572 Точки

Здравей Галя,

това решение е наистина много, много по-кратко и елегантно, и за да даде пълните 100 точки в judge има нужда от една малка добавка:

От една страна counterBits % step == 1, всъщност обхваща случая counterBits == 1, защото например 1 % 4  = 1

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

number % 1 = 0; и никога няма да има bits-up-ване на която и да било позиция.

По тази причина авторското решение добавя още едно изискване:

if ((index % step == 1) || (step == 1 && index > 0))

В случая (step == 1 && index > 0) ще променяме на 1-ца битовете на абсолютно всяка позиция с изключение на нулевата.

Може да тестваш тук

2
GalyaGeorgieva avatar GalyaGeorgieva 88 Точки

Благодаря, за допълнението. Бях забравила за това изключение и сега всичко е точно :)

1