Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

помогите найти ошибку

9.1K
05 июля 2005 года
net
15 / / 22.06.2005
кусок функции (складываем бинарные числа),
проблема в следующем: если числа одной длины, работает правильно, если нет, то в результате выводит число с обрезанным последним символом.
Прохожу отладчиком и вижу в первом прохождении по циклу что-то невероятное: length(max)=9 i=1 length(max)-i=21!!!

for i:=1 to length(max) do begin
if i<=length(min) then begin
if (max[length(max)-i+1]='0') and (min[length(min)-i+1]='0') and (buf='0') then begin
res:='0'+res; buf:='0'; end
else if (max[length(max)-i+1]='0') and (min[length(min)-i+1]='0') and (buf='1') then begin
res:='1'+res; buf:='0'; end
else if (max[length(max)-i+1]='1') and (min[length(min)-i+1]='1') and (buf='0') then begin
res:='0'+res; buf:='1'; end
else if (max[length(max)-i+1]='1') and (min[length(min)-i+1]='1') and (buf='1') then begin
res:='1'+res; buf:='1'; end
else if (max[length(max)-i+1]='0') and (min[length(min)-i+1]='1') and (buf='0') then begin
res:='1'+res; buf:='0'; end
else if (max[length(max)-i+1]='0') and (min[length(min)-i+1]='1') and (buf='1') then begin
res:='0'+res; buf:='1'; end;
end
else begin
if buf='1' then
if (max[length(max)-i+1]='1') then begin
res:='0'+res; buf:='1'; end
else begin
res:='1'+res; buf:='0'; end
else
res:=max[length(max)-i+1]+res;
end;
end;
488
05 июля 2005 года
Mоngооsе
465 / / 01.04.2005
В конце обработки нужно проверить buf. Если равна 1, тогда приписать к res.

Не проще вместо [length(max)-i+1] ввести 2 индекса

min_ptr = length(min);
max_ptr = length(max);

и в конце цикла отнимать из них 1?
9.1K
06 июля 2005 года
net
15 / / 22.06.2005
Цитата:
Originally posted by Mоngооsе
В конце обработки нужно проверить buf. Если равна 1, тогда приписать к res.

Не проще вместо [length(max)-i+1] ввести 2 индекса

min_ptr = length(min);
max_ptr = length(max);

и в конце цикла отнимать из них 1?



я это и так делаю : if buf='1' then res:='1'+res;
Но дело не в этом, ведь отнимается не первая цифра слева, а первая справа (здесь цифры собираются справа налево)

585
06 июля 2005 года
honeybeer
297 / / 06.09.2004
Цитата:
Originally posted by net
кусок функции (складываем бинарные числа),
проблема в следующем: если числа одной длины, работает правильно, если нет, то в результате выводит число с обрезанным последним символом.
Прохожу отладчиком и вижу в первом прохождении по циклу что-то невероятное: length(max)=9 i=1 length(max)-i=21!!!

for i:=1 to length(max) do begin
if i<=length(min) then begin
if (max[length(max)-i+1]='0') and (min[length(min)-i+1]='0') and (buf='0') then begin
res:='0'+res; buf:='0'; end
else if (max[length(max)-i+1]='0') and (min[length(min)-i+1]='0') and (buf='1') then begin
res:='1'+res; buf:='0'; end
else if (max[length(max)-i+1]='1') and (min[length(min)-i+1]='1') and (buf='0') then begin
res:='0'+res; buf:='1'; end
else if (max[length(max)-i+1]='1') and (min[length(min)-i+1]='1') and (buf='1') then begin
res:='1'+res; buf:='1'; end
else if (max[length(max)-i+1]='0') and (min[length(min)-i+1]='1') and (buf='0') then begin
res:='1'+res; buf:='0'; end
else if (max[length(max)-i+1]='0') and (min[length(min)-i+1]='1') and (buf='1') then begin
res:='0'+res; buf:='1'; end;
end
else begin
if buf='1' then
if (max[length(max)-i+1]='1') then begin
res:='0'+res; buf:='1'; end
else begin
res:='1'+res; buf:='0'; end
else
res:=max[length(max)-i+1]+res;
end;
end;



И причем здесь С++ Builder :???:

9.1K
06 июля 2005 года
net
15 / / 22.06.2005
Цитата:
Originally posted by honeybeer
И причем здесь С++ Builder :???:


ну да, извините, перепутала раздел
и ошибку нашла, так что вопрос закрыт

488
06 июля 2005 года
Mоngооsе
465 / / 01.04.2005
Цитата:
Originally posted by net
...и ошибку нашла, так что вопрос закрыт

Ага, из 8-и случаев было обработано только 6.

Хоть, для начала неплохо, но тебе удалось написать самый неэффективный алгоритм решения этой задачи. Много лишних сравнений например и нет смысла buf:='1', если он равен '1'.

Есть еще два алгоритма.

В первой подсчитывается текущее количество единиц.
Если он равен 0, res:='0', buf:='0',
при 1, res:='1', buf:='0', итд.

А во второй, самой эффективной. res сразу же присваивается max. Тогда конкатенации внутри цикла отпадают. И внутри цикла сравнивается только max и min[j]. Если они равны, тогда значение buf меняется на противоположный, если не равны, тогда меняется значение res.

9.1K
08 июля 2005 года
net
15 / / 22.06.2005
спасибо, это действительно ценный совет
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог