Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.04.2019, 12:03   #1
Rimean
 
Регистрация: 23.11.2016
Сообщений: 9
По умолчанию Дано число, запись которого не содержит нулей. Запишите число теми же цифрами, но в обратном порядке

Здравствуйте! Написала код для решения следующей задачи:

Дано число n, десятичная запись которого не содержит нулей. Получите число, записанное теми же цифрами, но в обратном порядке. (Думаю, логично, что число должно быть неотрицательным).

Но теперь нужно переписать имеющийся код, сделать так, чтобы задача была решена методом рекурсии (я пытаюсь для этого использовать команды (while/if ... then; else). Я попыталась это сделать, но программа работает неверно. Помогите, пожалуйста, найти ошибки (может быть они очень глупые). Заранее благодарю!

Исходный код, работает исправно (первая кнопка - "ввести", вторая- "выполнить"):

Код:
procedure TForm1.Button1Click(Sender: TObject);
vari,l:integer; 
begin
memo2.Clear;
i:=strtoint(edit1.Text);
whilei>0 do begin
l:=i mod 10;
i:=i div 10;
if l=0 then
begin
showmessage('введите другое число');
edit1.Clear;
end;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
vard,i,k:integer;
begin
i:=strtoint(edit1.Text);
d:=0;
whilei>0 do begin
k:=i mod 10;
i:=i div 10;
d:=d*10+k;
end;
Memo2.Lines.add(inttostr(d));
end;
end.
То, что я попыталась сделать (минуя несколько вариантов кодов). Для простоты я убрала вторую кнопку, оставила на форм только одну.
1 вариант:

Код:
function vvod(i,l:integer):integer;
begin
l:=i mod 10;
i:=i div 10;
vvod:=i;
end;
 
 
function povorot(i,d,k:integer):integer;
begin
k:=i mod 10;
i:=i div 10;
d:=d*10+k;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var i,l,h,d,k:integer;
begin
i:=strtoint(Edit1.Text);
while i>0 do begin
vvod(i,l);
if l=0 then
begin
showmessage('введите другое число');
Edit1.clear;
end
else
begin
i:=strtoint(edit1.Text);
d:=0;
while i>0 do
povorot(i,d,k);
memo2.Lines.add(inttostr(d));
end;
end;
end;
end.
2 вариант:

Код:
function povorot(i,d,k:integer):integer;
begin
k:=i mod 10;
i:=i div 10;
d:=d*10+k;
end;
function vvod(i,l,d,k:integer):integer;
begin
l:=i mod 10;
i:=i div 10;
if l=0 then
showmessage('введите другое число')
else
begin
//i:=strtoint(edit1.Text);
d:=0;
while i>0 do
povorot(i,d,k);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
vari,l,h,d,k:integer;
begin
i:=strtoint(Edit1.Text);
while i>0 do begin
vvod(i,l,d,k);
memo2.Lines.add(inttostr(d));
end;
end;
end.
Rimean вне форума Ответить с цитированием
Старый 11.04.2019, 13:52   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Rimean Посмотреть сообщение
Но теперь нужно переписать имеющийся код, сделать так, чтобы задача была решена методом рекурсии
не совсем честный ход (с двумя переменными-параметрами) устроит вариант?

тогда
Код:
program ideone;

function Reverse(N, p:LongInt):LongInt;
begin
if N<=0 then Reverse := p
else Reverse := Reverse(N div 10, p*10+(n mod 10))
end;

var i : LongInt;
begin
	i:=57918;
	WriteLn(Reverse(i,0))
end.
пруф - https://ideone.com/GbIAxJ
Serge_Bliznykov вне форума Ответить с цитированием
Старый 11.04.2019, 14:17   #3
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,543
По умолчанию

как-то так
Код:
function Requrse(number: integer): integer;
var 
  d, m, r: integer;
begin
  result:=number;
  if number<10 then Exit; 

  d:=number mod 10;
  m:=number div 10;

  r:=m; result:=d;
  repeat 
   result:=result*10; 
    r:=r div 10; 
  until r=0;  
  result:=result + Requrse(m); 
end;
не проверял.

для любителей сборка с первых цифр (и тоже без проверки)
Код:
function Requrse(number: integer): integer;
var 
  d, m, r: integer;
begin
  result:=number;
  if number<10 then Exit; 

  d:=number;
  r:=1;
  while d>=10 do begin 
    d:=d div 10; // в конце концов получим ПЕРВУЮ цифру
    r:=r*10; // и ее порядок
  end;
  m:=number -d*r; // а значит и "ее остаток"

  result:=Requrse(m) *10 +d;
end;
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 11.04.2019 в 14:30.
evg_m вне форума Ответить с цитированием
Старый 11.04.2019, 16:43   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
как-то так
я тоже не проверял ваш код. но мне кажется, что это неверное решение.
ведь какой смысл в рекурсии, если внутри используется тот же цикл, что и без неё?!
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Для данного натурального числа найдите число, цифры которого записаны в обратном порядке. anteletaceve Помощь студентам 2 26.03.2019 00:57
[C++] Дано N - значное число и число K. Заданное число N нужно K-значным: либо удалить из числа N несколько первых цифр, либо в конце числа N добавить несколько нулей ClarkBrown Помощь студентам 1 10.12.2017 21:32
Для всех целых чисел отрезка [A,B] получить числа, записанные теми же цифрами, но в обратном порядке.(c++) ksly Помощь студентам 6 20.09.2015 23:29
C++ записать цифрами число в обратном порядке Anya She Помощь студентам 8 19.12.2012 20:37