Технический форум

Технический форум (http://www.tehnari.ru/)
-   Помощь студентам (http://www.tehnari.ru/f41/)
-   -   Задача о дробях (http://www.tehnari.ru/f41/t103545/)

Vladimir_S 27.07.2015 10:19

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

Цитата:

Здравствуйте! Подскажите пожалуйста, как сделать её нужно?? Может литература есть хорошая и понятная по таким задачам, где входные и выходные файлы? (если что, то я на 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.

А вот результат:

DDREDD 27.07.2015 10:45

Вложений: 1
Владимир, вот каждый раз ловлю себя на мысли что не та у вас аватарка, не та!!!
Надо что-то типа этого :D
Вложение 234229

Vladimir_S 27.07.2015 10:50

Цитата:

Сообщение от DDREDD (Сообщение 1148260)
Владимир, вот каждый раз ловлю себя на мысли что не та у вас аватарка, не та!!! Надо что-то типа этого

Не, Сань, - я старый ленивый ретроград ископаемый! :D

DiM 27.07.2015 12:10

Цитата:

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

Альтруист, фанат и интеллектуал. Автарка вполне отражает, так как сейчас такой набор качеств вымирает как динозавры когда то.
Цитата:

Сообщение от Vladimir_S (Сообщение 1148256)
Правда, попытки вести диалог с заказчицей через ЛС натолкнулись на гробовое молчание последний, что меня несколько рассердило

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

Счастье 27.07.2015 19:05

Точно, такую аватарку надо)))


Часовой пояс GMT +4, время: 07:50.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.