помогите найти ошибку
проблема в следующем: если числа одной длины, работает правильно, если нет, то в результате выводит число с обрезанным последним символом.
Прохожу отладчиком и вижу в первом прохождении по циклу что-то невероятное: 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;
Не проще вместо [length(max)-i+1] ввести 2 индекса
min_ptr = length(min);
max_ptr = length(max);
и в конце цикла отнимать из них 1?
В конце обработки нужно проверить buf. Если равна 1, тогда приписать к res.
Не проще вместо [length(max)-i+1] ввести 2 индекса
min_ptr = length(min);
max_ptr = length(max);
и в конце цикла отнимать из них 1?
я это и так делаю : if buf='1' then res:='1'+res;
Но дело не в этом, ведь отнимается не первая цифра слева, а первая справа (здесь цифры собираются справа налево)
кусок функции (складываем бинарные числа),
проблема в следующем: если числа одной длины, работает правильно, если нет, то в результате выводит число с обрезанным последним символом.
Прохожу отладчиком и вижу в первом прохождении по циклу что-то невероятное: 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 :???:
И причем здесь С++ Builder :???:
ну да, извините, перепутала раздел
и ошибку нашла, так что вопрос закрыт
...и ошибку нашла, так что вопрос закрыт
Ага, из 8-и случаев было обработано только 6.
Хоть, для начала неплохо, но тебе удалось написать самый неэффективный алгоритм решения этой задачи. Много лишних сравнений например и нет смысла buf:='1', если он равен '1'.
Есть еще два алгоритма.
В первой подсчитывается текущее количество единиц.
Если он равен 0, res:='0', buf:='0',
при 1, res:='1', buf:='0', итд.
А во второй, самой эффективной. res сразу же присваивается max. Тогда конкатенации внутри цикла отпадают. И внутри цикла сравнивается только max и min[j]. Если они равны, тогда значение buf меняется на противоположный, если не равны, тогда меняется значение res.