Как перевернуть число в паскале

от admin

Получить реверсную запись трехзначного числа

Формулировка. Сформировать число, представляющее собой реверсную (обратную в порядке следования разрядов) запись заданного трехзначного числа. Например, для числа 341 таким будет 143.

Давайте разберемся с условием. В нашем случае с клавиатуры вводится некоторое трехзначное число (трехзначными называются числа, в записи которых три разряда (то есть три цифры), например: 115, 263, 749 и т. д.). Нам необходимо получить в некоторой переменной число, которое будет представлять собой реверсную запись введенного числа. Другими словами, нам нужно перевернуть введенное число «задом наперед», представить результат в некоторой переменной и вывести его на экран.

Решение. Определимся с выбором переменных и их количеством. Ясно, что одна переменная нужна для записи введенного числа с клавиатуры, мы обозначим ее как n. Так как нам нужно переставить разряды числа n в некотором порядке, следует для каждого из них также предусмотреть отдельные переменные. Обозначим их как a (для разряда единиц), b (для разряда десятков) и c (для разряда сотен).

Теперь можно начать запись самого алгоритма. Будем разбирать его поэтапно:

1) Вводим число n;

2) Работаем с разрядами числа n. Как известно, последний разряд любого числа в десятичной системе счисления – это остаток от деления этого числа на 10. В терминах языка Pascal это означает, что для получения разряда единиц нам необходимо присвоить переменной a остаток от деления числа n на 10. Этому шагу соответствует следующий оператор:

Получив разряд единиц, мы должны отбросить его, чтобы иметь возможность продолжить работу с разрядом десятков. Для этого разделим число n на 10. В терминах Pascal, опять же, это означает: присвоить переменнойn результат от деления без остатка числа n на 10. Это мы сделаем с помощью оператора

3) Очевидно, что после выполнения п. 2 в переменной n будет храниться двухзначное число, состоящее из разряда сотен и разряда десятков исходного. Теперь, выполнив те же самые действия еще раз, мы получим разряд десятков исходного числа, но его уже нужно присваивать переменной b.

4) В результате в переменной n будет храниться однозначное число – разряд сотен исходного числа. Мы можем без дополнительных действий присвоить его переменной c.

5) Все полученные в переменных числа – однозначные. Теперь переменная n нам больше не нужна, и в ней нужно сформировать число-результат, в котором a будет находиться в разряде сотен, b – десятков, c – единиц. Легко понять, что для этого нам следует умножить a на 100, прибавить к полученному числу b, умноженное на 10 и cбез изменения, и весь этот результат присвоить переменной c. Это можно записать так:

n := 100 * a + 10 * b + c;

6) Далее остается только вывести полученное число на экран.

Код:

  1. program ReverseNum;
  2. var
  3. n, a, b, c: word;
  4. begin
  5. readln(n);
  6. a := n mod 10;
  7. n := n div 10;
  8. b := n mod 10;
  9. n := n div 10;
  10. c := n;
  11. n := 100 * a + 10 * b + c;
  12. writeln(n)
  13. end.

Проверим работу программы на произвольном варианте введенных данных. Для этого выполним ее «ручную прокрутку», проделав с введенным числом те же действия, которые должен выполнить алгоритм.

Пусть пользователем введено число 514. Покажем в таблице, какие значения будут принимать переменные послевыполнения соответствующих строк. При этом прочерк означает, что значение переменных на данном шаге не определено, а красным цветом выделены переменные, которые изменяются:

№ строки n a b c
7 514
8 514 4
9 51 4
10 51 4 1
11 5 4 1
12 5 4 1 5
13 415 4 1 5

Нетрудно понять, что написанная программа будет выводить правильный ответ для любого заданного трехзначного числа, так как в соответствии с алгоритмом заполнение данной таблицы возможно лишь единственным образом. Это значит, что мы можем представить число в виде абстрактного трехзначного числа xyz, (в нем каждая буква должна быть заменена на любое число от 0 до 9, конечно, за исключением тех случаев, когда оно перестает быть трехзначным), и работая с разрядами этого числа, показать, что в результате работы ответом будет число zyx.

Как перевернуть число в паскале

program num_revert;
Var Number, i, j, k: integer;
Label 1;
begin
Write( ‘Введите 3-х значное число : ‘ );
1:ReadLn(Number);

if (Number < 100) OR (Number > 999) then
begin
writeln(‘Неверное число, попробуйте снова’);
GoTo 1
end;

Write( ‘Цифры числа ‘ , Number , ‘ : ‘ );
i := Number div 100;
j := Number div 10 mod 10;
k := Number div 1 mod 10;

Как перевернуть число в паскале

Профиль
Группа: Участник
Сообщений: 292
Регистрация: 27.1.2007

Репутация: нет
Всего: нет

Здравствуйте!
Помню, как то мне попалась задачка при поступлении на одни курсы:
Дано целое число ( любое ).
Без опреаций со строками преобразовать его так, чтобы оно было записано задом наперёд.

Я так и не знаю, как её решить.

С уважением, Антон.

Профиль
Группа: Участник
Сообщений: 154
Регистрация: 25.1.2007

Читать:
Как в nginx обрабатывать ссылки на кириллице

Репутация: нет
Всего: 2

Код
var i,n,j: integer;
a: array [1..10] of byte
begin
readln(n);
i:=0;
while n<>0 do
begin
inc(i);
a[i]:=n mod 10;
n:=n div 10;
end;
for j:=i to 1 do
write(a[i]);
end.

Это сообщение отредактировал(а) Strannik — 31.1.2007, 11:09

Профиль
Группа: Участник Клуба
Сообщений: 7325
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 2
Всего: 146

Код
var i,n,j: integer;

Профиль
Группа: Участник
Сообщений: 292
Регистрация: 27.1.2007

Репутация: нет
Всего: нет

Я тогда примерно так и написал, но меня интересует, можни ли её решить каким нибудь хитрым способом, поигавшись с числами, может в бинарном виде. ( Это типа как обменять значения двух переменных без участия третьей ) Вот в таком вот духе.

Профиль
Группа: Участник Клуба
Сообщений: 7325
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 2
Всего: 146

Vadim A. Kazantsev

Профиль
Группа: Участник
Сообщений: 291
Регистрация: 3.12.2006
Где: Moscow, Russia

Репутация: нет
Всего: 14

Ну, блин, ANTON_AL, чё-то ты ни фига подробно, то нужно не засписал.
Во-первых, не указал язык программирования => приходится гадать между двумя самыми пополярными C (C++) и Pascal (Delphi).
Во-вторых, что не так очевидно, не указана система счисления, представление числа в которой требуется инвертировать. Скорее всего десятиное. Но также вполне возможно, что двоичное. [Крайне мало-]вероятны все остальные.
В-третьих, не слишком жёсткие ограниения, которые легко обошёл Strannik, заюзав в каестве дополнительной временной структуры хранения данных не строку, а массив. Наверное, надо было сказать, что допустимы только численные (в т.ч. побитовые) операции, без прочих внешних копирований.
В-четвёртых: «Дано целое число ( любое )». Наверно, всё-таки, не любое, а неотрицательное.
Пока, вроде, все замечания.

Romikgy привёл более устойчивую к ограниениям версию, чем Strannik.

Ещё есть такие понятия, как реверс битов и байтов. Может прогится.
Из книжки Генри Уоррена, мл. «Алгоритмические трюки для программистов»:
«Ниже показан эффективный метод реверса битов в слове [3]: в первой строке меняются местами соседние биты, во второй — соседние 2-битовые поля и т.д.Все пять операторов присвоения можно выполнять в произвольном порядке.

Код
x = (x & 0x55555555) << 1 | (x & 0xAAAAAAAA) >> 1;
x = (x & 0x33333333) << 2 | (x & 0xCCCCCCCC) >> 2;
x = (x & 0x0F0F0F0F) << 4 | (x & 0xF0F0F0F0) >> 4;
x = (x & 0x00FF00FF) << 8 | (x & 0xFF00FF00) >> 8;
x = (x & 0x0000FFFF) << 16 | (x & 0xFFFF0000) >> 16;

Для ряда машин можно воспользоваться усовершенствованием, приведённым влистинге 7.1, которое заключается в том, чтобы избежать больших непосредственно задаваемых значений. Этот код требует выполнения 30 базовых RISC-команд и не использует команд ветвления.

Листинг 7.1. Реверс битов

Код
unsigned rev(unsigned x)
<
x = (x & 0x55555555) << 1 | (x >> 1) & 0x55555555;
x = (x & 0x33333333) << 2 | (x >> 2) & 0x33333333;
x = (x & 0x0F0F0F0F) << 4 | (x >> 4) & 0x0F0F0F0F;
x = (x << 24) | ((x & 0xFF00) << 8) |
((x >> 8) & 0xFF00) | (x >> 24);
return x;
>

———————
[ИСТОНИКИ ИНФОРМАЦИИ]
3. Найдено в подпрограмме интерпретатора REXX, написанной Марком Аусландером (Marc A. Auslander).»

Это сообщение отредактировал(а) V.A.KeRneL — 4.2.2007, 17:51

Профиль
Группа: Участник
Сообщений: 154
Регистрация: 25.1.2007

Репутация: нет
Всего: 2

Цитата
Romikgy привёл более устойчивую к ограниениям версию, чем Strannik.

Strannik привёл решение максимально быстропишущееся (из тех что приходят в голову сразу), удовлетворяющее заданному ограничению. (на олимпиадах иначе нельзя. ).

V.A.KeRneL, респект! Классную информацию нашел. Мне вот буквально только что эту книгу («Алгоритмические трюки для программистов») скинули.

iOS Lead Developer

Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: 1
Всего: 128

Код
Program Revers;
Var num: Integer;
Begin

while( num mod 10 > 0 )
begin
Write( num mod 10 );
num = num div 10;
end;

Все! Коротко, ясно, и переменная всего одна.

Это сообщение отредактировал(а) mr.Anderson — 4.2.2007, 16:17

Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: нет
Всего: 88

Цитата(mr.Anderson @ 4.2.2007, 15:16 )
Коротко, ясно, и переменная всего одна.


mr.Anderson
, а ты свой код проверял? Чё та мне кажется, что если ввести число, например 12034, то будет не так уж коротко, а тем более, ясно. Но, может быть я ошибаюсь.

Vadim A. Kazantsev

Профиль
Группа: Участник
Сообщений: 291
Регистрация: 3.12.2006
Где: Moscow, Russia

Репутация: нет
Всего: 14

Код
while( num > 0 )
Код
while( num mod 10 > 0 )

iOS Lead Developer

Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Как перевернуть число

Как перевернуть натуральное число?
Было 12345 Стало 54321

000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000010

Похожие статьи