IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> дроби, перевести дробь
Bard
сообщение 15.03.2007 22:59
Сообщение #1


Учиться, учиться еще раз учиться
***

Группа: Пользователи
Сообщений: 158
Пол: Мужской
Реальное имя: Яшар

Репутация: -  3  +


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

Большое спс за ранее...


--------------------
Чтобы поразить цель важна не точность, а смелость
Шарль Луи Монтескё
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
klem4
сообщение 16.03.2007 9:23
Сообщение #2


Perl. Just code it!
******

Группа: Модераторы
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


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


добавлено

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

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


не угадал smile.gif


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 16.03.2007 10:13
Сообщение #3


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


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

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

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

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

не угадал smile.gif

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


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Bard
сообщение 16.03.2007 12:51
Сообщение #4


Учиться, учиться еще раз учиться
***

Группа: Пользователи
Сообщений: 158
Пол: Мужской
Реальное имя: Яшар

Репутация: -  3  +



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


--------------------
Чтобы поразить цель важна не точность, а смелость
Шарль Луи Монтескё
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 16.03.2007 13:37
Сообщение #5


Гость






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
сообщение 16.03.2007 15:14
Сообщение #6


Профи
****

Группа: Пользователи
Сообщений: 660
Пол: Мужской
Реальное имя: Михаил

Репутация: -  11  +


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


--------------------
Никогда не жадничай. Свои проблемы с любовью дари людям!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 16.03.2007 15:20
Сообщение #7


Гость






Цитата
Вот этого я не понял...
Я вот так делал:
Спойлер (Показать/Скрыть)
 К началу страницы 
+ Ответить 
Bard
сообщение 16.03.2007 17:01
Сообщение #8


Учиться, учиться еще раз учиться
***

Группа: Пользователи
Сообщений: 158
Пол: Мужской
Реальное имя: Яшар

Репутация: -  3  +


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


--------------------
Чтобы поразить цель важна не точность, а смелость
Шарль Луи Монтескё
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 16.03.2007 17:14
Сообщение #9


Гость






А ты убери строку
a := 7; b := 30;
, иначе у тебя всегда будет вычисляться 7/30, независимо, от того, что ты введешь...
 К началу страницы 
+ Ответить 
hiv
сообщение 16.03.2007 17:20
Сообщение #10


Профи
****

Группа: Пользователи
Сообщений: 660
Пол: Мужской
Реальное имя: Михаил

Репутация: -  11  +


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


--------------------
Никогда не жадничай. Свои проблемы с любовью дари людям!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Bard
сообщение 16.03.2007 17:23
Сообщение #11


Учиться, учиться еще раз учиться
***

Группа: Пользователи
Сообщений: 158
Пол: Мужской
Реальное имя: Яшар

Репутация: -  3  +


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

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

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


--------------------
Чтобы поразить цель важна не точность, а смелость
Шарль Луи Монтескё
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 28.04.2024 7:20
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"