Помощь - Поиск - Пользователи - Календарь
Полная версия: дроби
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Bard
Помогите мне перевести обычную дробь в десятичную wacko.gif ...вот кое что есть. yes2.gif

var
ar:array[1..2000]of integer;
a,c,d,b:longint;
begin
readln(a);readln(b);
repeat
inc(d);
if a>b then begin ar[d]:=a div b; a:=a mod b; end;
a:=a*10;
until (a=0) or (d=2000);
for c:=1 to 2000 do
write(ar[c]);
end;
end.


но эта прога не определяет blink.gif место запятой и если есть повторяющиеся числа после запятой то их не записывает в таком виде:

1/3=0.(3)
2/3=0.(6)
1/7=0.(142857) и т.д

Большое спс за ранее...
klem4
Как вариант, переводить число в троку, и искать есть ли после запятой постоянно повторяющиеся последовательности. Сначала смотреть есть ли постоянное посторение первого символа, если нет, первых двух, если нет, первых трех и так далее до длины length(s) div 2, где s содержит только дробную часть.


добавлено

Только пожалуй немного сложнее, придется сделать еще один цикл, с какого символа от начала начинать искать повторения, ведь наверное возможны случаи 1.487(3)

Lapp наверное об этом сечас пишет ?))


не угадал smile.gif
Lapp
Запятую ставить просто.. Сначала выводишь первый элемент массива, за ним ставишь запятую, а потом все остальные (начиная со второго в цикле).
А вот отслеживать период - это посложнее.. Не обязательно переводить в строку, можно отслеживать момент, когда переменная a повторится.

И еще - у тебя ошибочка. Знак > замени на >=.

Добавлено через 4 мин.
Цитата(klem4 @ 16.03.2007 9:23) *

Lapp наверное об этом сечас пишет ?))

не угадал smile.gif

smile.gif сколько программистов - столько и подходов! smile.gif
Интересно бы устроить решение задачи (несложной), но не показывать до некоторого времени, а потом сравнить.. smile.gif
Bard

var
ar:array[1..2000]of integer;
a,c,d,b:longint;
begin
readln(a);readln(b);
repeat
inc(d);
if a>b then begin ar[d]:=a div b; a:=a mod b; end;
a:=a*10;
until (a=0) or (d=2000);
for c:=1 to 2000 do begin
if c=2 then write('.');
write(ar[c]);
end;
end;
end.


Спасибо за помощь good.gif ...проблему с запятой я уже решил но
с повторениями ни как не могу разобраться... nea.gif
volvo
arximed, я бы делал так: сначала находим для дроби период вот по этому алгоритму: Период бесконечной дроби N/M по основанию P

А вот потом начинается самое интересное: при заполнении массива Ar просто просматриваем последние N заполненных ячеек (где N = длине периода), и если их содержимое совпадает с самим периодом - то все, заканчиваем цикл, и распечатываем значения...

Программу для проверки этого способа я написал, конечно, ее не покажу, но способ работает. Вот результаты прогона для дробей 1/7, 1/3, 2/3, 2/7, 7/30 и 3/8 соответственно (сначала печатается только период, а потом- результат):
Running "f:\vlady documents\programs\pas\__drb.exe a.txt a2.txt"
142857
0.(142857)
Running "f:\vlady documents\programs\pas\__drb.exe a.txt a2.txt"
3
0.(3)
Running "f:\vlady documents\programs\pas\__drb.exe a.txt a2.txt"
6
0.(6)
Running "f:\vlady documents\programs\pas\__drb.exe a.txt a2.txt"
285714
0.(285714)
Running "f:\vlady documents\programs\pas\__drb.exe a.txt a2.txt"
428571
0.(428571)
Running "f:\vlady documents\programs\pas\__drb.exe a.txt a2.txt"
3
0.2(3)
Running "f:\vlady documents\programs\pas\__drb.exe a.txt a2.txt"
0
0.375
hiv
Начал писать прогу - volvo как всегда опередил...
Спасибо ему за ссылку, если бы я раньше выложил, код был бы неправильный!
Цитата(volvo @ 16.03.2007 13:37) *
и если их содержимое совпадает с самим периодом - то все, заканчиваем цикл, и распечатываем значения...
Вот этого я не понял...
Я делал так - сравнивал последний полученный остаток со всеми остальными, полученными ранее - если совпадает, то найдена периодичность.
Вот код:
Спойлер (Показать/Скрыть)
volvo
Цитата
Вот этого я не понял...
Я вот так делал:
Спойлер (Показать/Скрыть)
Bard
Volvo,извини но я не понял что твоя прога вычисляетjava script:add_smilie(":!4:","smid_46")?почему что не вводишь она всегда выдает 3 и 2.(3)? mega_chok.gif
volvo
А ты убери строку
a := 7; b := 30;
, иначе у тебя всегда будет вычисляться 7/30, независимо, от того, что ты введешь...
hiv
Цитата(volvo @ 16.03.2007 15:20) *
Я вот так делал:
Теперь понял. Твой код эффективней.
Bard
Цитата(volvo @ 16.03.2007 18:14) *

А ты убери строку
a := 7; b := 30;
, иначе у тебя всегда будет вычисляться 7/30, независимо, от того, что ты введешь...

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