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

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

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

Автор: arximed 16.03.2007 2:59

Помогите мне перевести обычную дробь в десятичную 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 16.03.2007 13:23

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


добавлено

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

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


не угадал smile.gif

Автор: Lapp 16.03.2007 14:13

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

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

Добавлено через 4 мин.

Цитата(klem4 @ 16.03.2007 9:23) *

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

не угадал smile.gif

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

Автор: arximed 16.03.2007 16:51


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 16.03.2007 17:37

arximed, я бы делал так: сначала находим для дроби период вот по этому алгоритму: http://algolist.manual.ru/maths/teornum/findperiod.php

А вот потом начинается самое интересное: при заполнении массива 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 16.03.2007 19:14

Начал писать прогу - volvo как всегда опередил...
Спасибо ему за ссылку, если бы я раньше выложил, код был бы неправильный!

Цитата(volvo @ 16.03.2007 13:37) *
и если их содержимое совпадает с самим периодом - то все, заканчиваем цикл, и распечатываем значения...
Вот этого я не понял...
Я делал так - сравнивал последний полученный остаток со всеми остальными, полученными ранее - если совпадает, то найдена периодичность.
Вот код:
Спойлер (Показать/Скрыть)

Автор: volvo 16.03.2007 19:20

Цитата
Вот этого я не понял...
Я вот так делал:
Спойлер (Показать/Скрыть)

Автор: arximed 16.03.2007 21:01

Volvo,извини но я не понял что твоя прога вычисляетjava script:add_smilie(":!4:","smid_46")?почему что не вводишь она всегда выдает 3 и 2.(3)? mega_chok.gif

Автор: volvo 16.03.2007 21:14

А ты убери строку

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

Автор: hiv 16.03.2007 21:20

Цитата(volvo @ 16.03.2007 15:20) *
Я вот так делал:
Теперь понял. Твой код эффективней.

Автор: arximed 16.03.2007 21:23

Цитата(volvo @ 16.03.2007 18:14) *

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

Спс я понял...