Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ подпрограмма

Автор: Светлана 15.12.2006 4:29

Здравствуйте! У меня вопрос по задачке...
Нужно заменить данное натуральное число на число, которое получается из исходного записью его цифр в обратном порядке (напр., дано число 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 15.12.2006 5:11

http://forum.pascal.net.ru/index.php?s=&showtopic=3916&view=findpost&p=30660
"Определить, является ли число палиндромом (без его преобразования в строку)" - там есть составление "обратного" числа...

Автор: Светлана 18.12.2006 20:11

Цитата(volvo @ 15.12.2006 1:11) *

http://forum.pascal.net.ru/index.php?s=&showtopic=3916&view=findpost&p=30660
"Определить, является ли число палиндромом (без его преобразования в строку)" - там есть составление "обратного" числа...




Я вот посмотрела эту функция, сдела прогу... но у меня как-то там странно... если я ввожу например число 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.

Автор: мисс_граффити 18.12.2006 23:02

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

Автор: Светлана 19.12.2006 0:51

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

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



а, спасибо! Понятно! Но у меня задача звучит так: Заменить данное натуральное число на число, которое получается из исходного записью его цифр в обратном порядке (напр., дано число 156, получить 651). Вот, я делала через строку, но мне посоветовали зайти на ссылку.. и вот, я так переделала прогу... Значит она теперь ваще неправильная????

Автор: мисс_граффити 19.12.2006 0:54

она правильная, просто ты ее не переделала 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.

Автор: Светлана 19.12.2006 10:13

Аааа, поняла!..... Спасибо Вам огромное!!!! good.gif

Автор: Светлана 23.12.2006 14:02

У меня тут такая проблемка... Мне сказали решать с массивом.... Я вот переделала... Но у меня как-то неправильно считает, не получае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.

заранее спасибо!

Автор: мисс_граффити 23.12.2006 14:55

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;

Автор: Светлана 24.12.2006 15:01

Цитата(мисс_граффити @ 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 в степени (в какой степени?)...

Автор: мисс_граффити 24.12.2006 17:22

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

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

Автор: Светлана 26.12.2006 16:09

Цитата(мисс_граффити @ 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я 26.12.2006 16:15

с - целого типа, а ты ей пытаешься присвоить значение вещественного.

Автор: мисс_граффити 26.12.2006 16:22

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

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

Автор: Светлана 26.12.2006 18:40

Цитата(мисс_граффити @ 26.12.2006 12:22) *

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


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

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


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




что эти строчки-то означают?

Автор: мисс_граффити 26.12.2006 18:40

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

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

Автор: Светлана 26.12.2006 18:47

Цитата(мисс_граффити @ 26.12.2006 14:40) *

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

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


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

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


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


Автор: мисс_граффити 26.12.2006 21: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
ну и т.д.

Автор: Светлана 27.12.2006 20:27

Цитата(мисс_граффити @ 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
ну и т.д.


спасибо!!! Ну тогда в таком виде и сдам прогу!!!