Помощь - Поиск - Пользователи - Календарь
Полная версия: подпрограмма
Форум «Всё о Паскале» > 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
ну и т.д.


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