Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Object Pascal: кроссплатформенные технологии > Перевод десятичного числа в двоичную, троичную...


Автор: zetxi815eb 26.1.2007, 23:54
Вот условье самой задачи:
Задача A. "Палиндром".
Входной файл input.txt
Выходной файл output.txt
Ограничение по времени 1 секунда на тест
Ограничение по памяти  4096К байт
Натуральное число называется палиндромом, если оно читается слева направо и справа налево одинаково. Известно, что для любого натурального числа можно подобрать такую систему счисления, в которой это число является палиндромом. Например, число 15 записывается в двоичной системе счисления как 1111 и является палиндромом.
Вход
В первой строке входного файла записано натуральное число N (N < 2^31). 
Выход
Запишите в выходной файл наименьшее основание системы счисления, в которой N является палиндромом.
Примеры входа и выхода
input.txt      output.txt
2        3
input.txt    output.txt
11        10

В Паскале мне раньше не приходилось переводить числа из одной системы в другую.

Подскажите по какой формуле это делать? Какой тип использовать?? Ведь N имеет тип longint.
Помогуте, плиз, желательно с коментариями...мне не столько важно решить эту задачу... я просто хочу разобраться в методе её решения.

Автор: Magister Y0da 27.1.2007, 01:26
где-то на форуме SoWa вроде выкладывал свой модуль перевода чисел из любой системысчисления в любую

Поищи  smile 

Автор: zetxi815eb 27.1.2007, 03:50
Magister Y0da, а можешь дать ссылку на этот форум?

Автор: volvo877 27.1.2007, 04:11
zetxi815eb,

FAQ тебе в помощь: http://vingrad.ru/DELPHI-DLP-001153
(правда, решение на Дельфях, но алгоритм-то остается... Можешь еще в поиске по разделу Паскаль ввести слово "счисления" - получишь ссылки на несколько интересных тем... Ну, и ссылки в самом низу этой вот страницы, которую ты сейчас читаешь  smile )

Автор: zetxi815eb 27.1.2007, 17:37
Вот...нашёл я наконец эту функцию:
Код

uses crt;
function FromDec(n, radix:longint):string;
var    s: String;
const    digit: string[16]='0123456789ABCDEF';
begin
s:='';
repeat
s:=digit[(n mod radix)+1]+s;
writeln ('s:=',s);
n:=n div radix;
until n=0;
FromDec:=s;
end;


var a,b,c:longint;
    t:string;
begin
clrscr;
a:=999999; b:=2;
t:=FromDec(a,b);
writeln (t);
readkey;
end.


Люди...вот только я не пойму как работает 8-я строчка...можете обьяснить?

Автор: volvo877 27.1.2007, 18:06
Код
s:=digit[(n mod radix)+1]+s;

Эта? smile

сначала находится последняя цифра числа (это n mod radixостаток от деления на основание с/с), но поскольку нумерация символов в строке в Турбо Паскале начинается с 1, а не с 0, а нам фактически нужна позиция символа в строке, представляющего заданное число в системе счисления с основанием radix, то мы к этой самой цифре прибавляем 1...

Дальше - строка преобразуется от конца числа к началу, поэтому, тот символ в новой с/с, который мы вытащили из строки (вот так: digit[(n mod radix)+1]), надо "прилепить" к старой строке-результату спереди, что и делается - сначала символ, потом строка. Результат опять же запоминается в той же строке...

Ну, и в 10-ой строке мы делим число нацело на основание с/с, чем "убираем" последнюю цифру, и процесс продолжается вновь... Пока число не превратится в 0...

Автор: Letov 31.3.2007, 12:13
Перевод дробного числа D (т.е любого) в p-ичную систему происходит по следующему алгоритму:
1.Умножить D на p;
2.Целую часть произведения представить соответствующей цифрой p-ичного представления;
3.Умножать D на p до тех пор, пока не будет достигнута требуемая точность (получится p-ичное число с k дробными разрядами) или дробная часть обратится в ноль.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)