• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Задача о дробях

Vladimir_S

Супермодераторы
Регистрация
27 Авг 2008
Сообщения
27,807
Реакции
1,025
Баллы
0
Задача о дробях

Получил на днях такое вот послание в ЛС от одного (точнее, одной) из постоянных участников форума:

Здравствуйте! Подскажите пожалуйста, как сделать её нужно?? Может литература есть хорошая и понятная по таким задачам, где входные и выходные файлы? (если что, то я на free pascal решаю)
(Время: 1 сек. Память: 16 Мб)
Требуется получить точное значение частного А/В для двух натуральных чисел A и B.
В единственной строке входного файла INPUT.TXT записано частное двух натуральных чисел, не превышающих 1000. Числа разделены символом «/» без лишних пробелов.
В выходной файл OUTPUT.TXT нужно вывести точное значение A/B без лишних точек, нулей и пробелов. В случае присутствия бесконечной записи числа следует вывести период в скобках.
Например, неправильно выведены числа: 08.92, 3.20, 120.6(6), 0.(33), 5.(0), 2. , .3, 0.33(03) .

Их следует выводить как 8.92, 3.2, 120.(6), 0.(3), 5, 2, 0.3, 0.3(30) .
Вообще-то я всегда прошу не ломиться с подобными просьбами в личку, а все задания выкладывать на форум. Но задачка интересная, поэтому взялся. Любопытно, что поиск в Сети практически ничего не дал: всякие умные дяди очень любят объяснять детям, как это решать "в столбик", а вот расписать алгоритм программы - ни! Правда, на одном форуме два СИ-шника пытались написать такую программу, но получилось сыро и глючно, в общем - не понравилось. Поэтому решал "из первых принципов".
Правда, попытки вести диалог с заказчицей через ЛС натолкнулись на гробовое молчание последней, что меня несколько рассердило, а потому я счёл возможным посвоевольничать: входной файл (как и выходной, естественно) может содержать не одну, а сколько угодно строк с дробями. Правила:
1. Записи дробей должны начинаться с крайней левой позиции, т.е. пробелов впереди быть не должно.
2. Каждая дробь располагается на своей отдельной строке.
3. Пустые строки не допускаются.
4. После введения последней дроби НЕ СЛЕДУЕТ переводить строку.
Адресация файлов может быть, естественно, изменена.
Вроде всё. Вот программа:
Код:
Var
 nom,den,d,m,Q:Word;
 n,j,p:Byte;
 f_in,f_ou:Text;
 Rem:Array[1..100] of Word;
 Fig:Array[1..100] of Byte;
 S_in,nom_st,den_st,S,St:String;
 Code:Integer;

Function Test_Rem(R:Word; k:Byte):Byte;
var
 b:Boolean;
 i:Byte;
begin
 b:=false;
 i:=0;
 repeat
  Inc(i);
  if i<=k then if Rem[i]=R then b:=true;
 until b or (i=k+1);
 if b then Test_Rem:=i else Test_Rem:=0;
end;

Begin
 Assign(f_in,'D:\Input.txt');
 Reset(f_in);
 Assign(f_ou,'D:\Output.txt');
 Rewrite(f_ou);
 Repeat
  Readln(f_in,S_in);
  p:=0;
  repeat
   Inc(p);
  until S_in[p]='/';
  nom_st:=Copy(S_in,1,p-1);
  den_st:=Copy(S_in,p+1,Length(S_in)-p);
  Val(nom_st,nom,Code);
  Val(den_st,den,Code);
  n:=1;
  S:='';
  Str((Nom div Den),St);
  S:=S+St;
  if (Nom mod den)>0 then
   begin
    S:=S+'.';
    m:=(Nom mod Den);
    Rem[1]:=m;
    repeat
     Inc(n);
     d:=m*10 div Den;
     m:=m*10 mod Den;
     Q:=Test_Rem(m,n-1);
     if (m>0) and (Q=0) then
      begin
       Rem[n]:=m;
       Fig[n]:=d
      end;
    until (m=0) or (Q>0);
    Rem[n]:=m;
    Fig[n]:=d;
    if m=0 then
     begin
      for j:=2 to n do
       begin
        Str(Fig[j],St);
        S:=S+St;
       end
     end
    else
     begin
      for j:=2 to Q do
       begin
        Str(Fig[j],St);
        S:=S+St;
       end;
      S:=S+'(';
      for j:=Q+1 to n do
       begin
        Str(Fig[j],St);
        S:=S+St;
       end;
      S:=S+')';
     end;
   end;
  Writeln(f_ou,S);
 Until EoF(f_in);
 Close(f_in);
 Close(f_ou);
End.
А вот результат:
 

Вложения

  • ME01.webp
    ME01.webp
    26.4 KB · Просмотры: 204
Владимир, вот каждый раз ловлю себя на мысли что не та у вас аватарка, не та!!!
Надо что-то типа этого :D
978094065.webp
 
Владимир, вот каждый раз ловлю себя на мысли что не та у вас аватарка, не та!!! Надо что-то типа этого
Не, Сань, - я старый ленивый ретроград ископаемый! :D
 
Получил на днях такое вот послание в ЛС от одного (точнее, одной) из постоянных участников форума
Альтруист, фанат и интеллектуал. Автарка вполне отражает, так как сейчас такой набор качеств вымирает как динозавры когда то.
Правда, попытки вести диалог с заказчицей через ЛС натолкнулись на гробовое молчание последний, что меня несколько рассердило

Да она в танке сто пудово, Анджелка сейчас на высадку готовится и следит за статой! А недавно еще чистку кадров в клане устроила, что отголоски к нам на форум докатились, поцик весь заплаканый прибежал в танковую тему среди ночи и стал сетовать на :jmur: свою несчастную судьбу которая для него приняла облик нашей железной леди :fellow:
 
Точно, такую аватарку надо)))
 
Назад
Сверху