Помощь - Поиск - Пользователи - Календарь
Полная версия: подпрограмма
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Светлана
Здравствуйте! У меня вопрос по задачке...
Нужно заменить данное натуральное число на число, которое получается из исходного записью его цифр в обратном порядке (напр., дано число 156, нужно получит 651).
Я делала через строку, у меня все запускалось, все было правильно.. но сказали переделать другим способом, так как мне даны числа, а не строка...


Program Perevernut;
function perevertysh (p:integer):integer;
 var S,a,a1,a2,a3:integer;
 begin
  write('Vvedite 3-x znachnoe chislo');
  readln(a);
  a1:=a mod 10;
  a:=a div 10;
  a2:=a mod 10;
  a3:=a div 10;
  S:=a1+a2+a3;
  writeln();
  readln
 end.


Я стала решать так.. но дальit до меня не доходит.. я понимаю, что надо сделать так, чтобы первое вставало на место последнего, второе - на место предпоследнего.. но как это сделать - не знаю. Помогите пож-та.
volvo
Замечательные числа
"Определить, является ли число палиндромом (без его преобразования в строку)" - там есть составление "обратного" числа...
Светлана
Цитата(volvo @ 15.12.2006 1:11) *

Замечательные числа
"Определить, является ли число палиндромом (без его преобразования в строку)" - там есть составление "обратного" числа...




Я вот посмотрела эту функция, сдела прогу... но у меня как-то там странно... если я ввожу например число 234, то у меня выводится False.., а число наоборот не печатается... а когда ввожу 0, то вводится True... Извините, что неправильно?



Program Pereverni;
function perevertysh(x:longint):boolean;
 var prev, T:longint;
  begin
   prev:=x;
   T:=0;
  while x<>0 do begin
   T:=T*10+(x mod 10);
   x:=x div 10;
  end;
   perevertysh:=(prev=t)
   end;
  var x:integer;
   begin
   writeln('Vvedite chislo');
   write('-->');
   readln(x);
   write('Poluchili:',perevertysh(x));
   readln
   end. 
мисс_граффити
Светлана, какой тип результа у функции perevertysh?
действительно, 234 - не перевертыш (234<>432), а ноль - перевертыш.
Светлана
Цитата(мисс_граффити @ 18.12.2006 19:02) *

Светлана, какой тип результа у функции perevertysh?
действительно, 234 - не перевертыш (234<>432), а ноль - перевертыш.



а, спасибо! Понятно! Но у меня задача звучит так: Заменить данное натуральное число на число, которое получается из исходного записью его цифр в обратном порядке (напр., дано число 156, получить 651). Вот, я делала через строку, но мне посоветовали зайти на ссылку.. и вот, я так переделала прогу... Значит она теперь ваще неправильная????
мисс_граффити
она правильная, просто ты ее не переделала smile.gif
Program Pereverni;
function perevertysh(x:longint):longint;
 var prev, T:longint;
  begin
   prev:=x;
   T:=0;
  while x<>0 do begin
   T:=T*10+(x mod 10);
   x:=x div 10;
  end;
   perevertysh:=t
   end;
  var x:integer;
   begin
   writeln('Vvedite chislo');
   write('-->');
   readln(x);
   write('Poluchili:',perevertysh(x));
   readln
   end. 
Светлана
Аааа, поняла!..... Спасибо Вам огромное!!!! good.gif
Светлана
У меня тут такая проблемка... Мне сказали решать с массивом.... Я вот переделала... Но у меня как-то неправильно считает, не получае6тся перевернутое число.. Помогите пож-та..


Program Pereverni;
 function perevertysh(x:integer):integer;
  var a:array[1..100] of integer;
      c,n,i:integer;
  begin
    n:=0; i:=i+1;
    while x<>0 do begin
    c:=x mod 10; a[i]:=c;
    x:=x div 10;
    n:=n+1; i:=i+1;
    end;
     c:=0;
     for i:=1 to n do
     c:=c+a[i]*(n-(i-1));
     perevertysh:=c;
     end;
   var x,c:integer;
   begin
    writeln('vvedite chislo');
    readln(x);
    write('Poluchili:',perevertysh(x));
    readln
    end.

заранее спасибо!
мисс_граффити
function perevertysh(x:integer):integer;
  var a:array[1..100] of integer;
      c,n,i:integer;
  begin
    n:=0; i:=i+1; {а чему у тебя равно i до этой операции? ты, наверное, хотела написать i:=1} 
    while x<>0 do begin
    c:=x mod 10; a[i]:=c;
    x:=x div 10;
    n:=n+1; i:=i+1;
    end;
     c:=0;
     for i:=1 to n do
     c:=c+a[i]*(n-(i-1));{а вот умножать надо не на (n-(i-1), а на 10 в степени}
     perevertysh:=c;
     end; 
Светлана
Цитата(мисс_граффити @ 23.12.2006 10:55) *


    n:=0; i:=i+1; {а чему у тебя равно i до этой операции? ты, наверное, хотела написать i:=1} 
    
     c:=c+a[i]*(n-(i-1));{а вот умножать надо не на (n-(i-1), а на 10 в степени}
     
 



я заменила, написала i:=1;

а как написать вот это: 10 в степени (в какой степени?)...
мисс_граффити
exp(k*ln(10))
где k-степень.
Самый простой способ, но его противность заключается в том, что возвращает вещественное число, что может дать пусть минимальную, но погрешность. Да и несовместимость типов даст.... Поэтому можешь округлять с использованием любой функции округления, а можешь написать свою функцию возведения 10 в определенную степень.

А степень будет определяться положением в массиве.
Смотри:
165,4=1*10^2+6*10^1+5*10^0+4*10^-1
(^обозначается степень)
вот и прикинь, где в массиве окажется какой разряд.
Светлана
Цитата(мисс_граффити @ 18.12.2006 20:54) *

она правильная, просто ты ее не переделала smile.gif
Program Pereverni;
T:=T*10+(x mod 10);
x:=x div 10;
   



извините, что вот эти 2 строчки означают?


Цитата(мисс_граффити @ 23.12.2006 10:55) *

function perevertysh(x:integer):integer;
  var a:array[1..100] of integer;
      c,n,i,k:integer;
  begin
    n:=0; i:=1;  
    while x<>0 do begin
    c:=x mod 10; a[i]:=c;
    x:=x div 10;
    n:=n+1; i:=i+1;
    end;
     c:=0;
     for i:=1 to n do
     c:=c+a[i]*(exp(k*ln(10));{а вот умножать надо не на (n-(i-1), а на 10 в степени}
     perevertysh:=c;
     end; 



вот, у меня высвечивается: error 26 в той строчке, где с:=
Ozzя
с - целого типа, а ты ей пытаешься присвоить значение вещественного.
мисс_граффити
Цитата
Самый простой способ, но его противность заключается в том, что возвращает вещественное число, что может дать пусть минимальную, но погрешность. Да и несовместимость типов даст.... Поэтому можешь округлять с использованием любой функции округления, а можешь написать свою функцию возведения 10 в определенную степень.

Ты бы хоть читала... Я же не зря это набирала.
Светлана
Цитата(мисс_граффити @ 26.12.2006 12:22) *

Ты бы хоть читала... Я же не зря это набирала.


конечно читала!!!... ток не поняла, что в прогу-то писать надо.... ааа sad.gif

Цитата(мисс_граффити @ 18.12.2006 20:54) *


   T:=T*10+(x mod 10);
   x:=x div 10;
   



что эти строчки-то означают?
мисс_граффити
round(exp(k*ln(10))) 

только твоя программа не знает, что такое k (в смысле, чему оно равно)! тебе надо рассчитывать степень исходя из индекса в массиве.
Светлана
Цитата(мисс_граффити @ 26.12.2006 14:40) *

round(exp(k*ln(10))) 

только твоя программа не знает, что такое k (в смысле, чему оно равно)! тебе надо рассчитывать степень исходя из индекса в массиве.


хорошо, поразбираюсь...

ответьте еще пож-та:
что ЭТО СТРОКА означает?


T:=T*10+(x mod 10);
 x:=x div 10;

мисс_граффити
допустим, у нас число х=351
Т изначально равно 0
T:=T*10+(x mod 10)
или, подставив значения:
T:=0*10+(351 mod 10)
T:=1
Потом x:=x div 10
x:=351 div 10
x:=35
идем на новую итерацию...
Т:=1*10+(35 mod 10)
T:=10+5
T:=15
ну и т.д.
Светлана
Цитата(мисс_граффити @ 26.12.2006 17:55) *

допустим, у нас число х=351
Т изначально равно 0
T:=T*10+(x mod 10)
или, подставив значения:
T:=0*10+(351 mod 10)
T:=1
Потом x:=x div 10
x:=351 div 10
x:=35
идем на новую итерацию...
Т:=1*10+(35 mod 10)
T:=10+5
T:=15
ну и т.д.


спасибо!!! Ну тогда в таком виде и сдам прогу!!!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.