Friday, May 19, 2017

Прозрачный код для задачи К. Полякова 506 тип (24)

                                                           Я не люблю фатального исхода
                                                           От жизни никогда не устаю
                                                           Я не люблю любое время года
                                                           Когда весёлых песен не пою
                                                                                           В.С. Высоцкий

(№ 506) Требовалось написать программу, которая получает на вход натуральное число N, не превосходящее 109, и выводит число, которое получается из N после удаления всех единиц; порядок остальных цифр при этом не меняется. Например, число 19520125 должно быть преобразовано в число 952025. Число, в котором все цифры – единицы и нули, должно быть преобразовано в 0. Незначащие нули в старших разрядах полученного числа печатать не нужно. Программист написал программу неправильно.

********************************************
Оригинальный код
********************************************
var N, R, T: longint;
d: integer;
begin
readln(N);
R:=0;
T:=1;
while N>0 do begin
d := N mod 10;
if d<>1 then begin
R := R + d*T;
T := T+1
end;
N := N div 10;
end;
writeln(T);
end.

***************************************************************************************
  Зачем писать преднамеренно код на языке высого уровня,искуственно
  избегая прозрачного хода вещей. Есть тип данных Extended, conversion
  Extended into Longint  in other words inside loop type Extended позволяет
  инкрементировать s и последовательно удалить единицы  :-

  if d <> 1 then begin
     s := s + d*exp(j*Ln(10));
     inc(j);
  end;

 Цикл сделан обратная конвертация :-
    s_out := Round(s);
    writeln (s_out);

Проблем при разработке хватает, чтобы не создавать их искуственно
***************************************************************************************
program prog3;
var N,j,s_out: longint;
d:  integer;
s:  extended;

begin
readln(N);
j :=0;
s :=0;

while N > 0 do begin
  d := N mod 10;
  if d <> 1 then begin
     s := s + d*exp(j*Ln(10));
     inc(j);
  end;
N := N div 10;
end;
s_out := Round(s);
writeln(s_out);
end.
***********************************************************************************
Корректировка программы К. Полякова № 506 (24) . По видимому, как предполагается
***********************************************************************************
program polkv1;
var N, R, T: longint;
d: integer;
begin
readln(N);
R:=0;
T:=1;
while N>0 do begin
d := N mod 10;
if d<>1 then begin
R := R + d*T;
// Fixed line bellow . It was T=T+1
T := T*10;
end;
N := N div 10;
end;
// Fixed line bellow . It was writeln(T);
writeln(R);
end.




 

No comments:

Post a Comment