Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.01.2013, 20:07   #1
vokar97
Пользователь
 
Аватар для vokar97
 
Регистрация: 23.10.2012
Сообщений: 27
Сообщение Pascal. Помочь найти ошибку в решение

Здравствуйте!
Столкнулся с такой проблемой, что сайт не принимает мое решение.
Похоже, что я где-то допустил ошибку, но не могу найти где (моя программа результаты верные, вроде, выдает)
Вот задача:
Цитата:
При разработке программного обеспечения, используемого для упрощения математических расчетов, часто появляется задача исследования некоторых свойств рациональных чисел, как то: проверка числа на простоту, проверка дроби на сократимость и прочие подобные проверки.

В данной задаче вам необходимо реализовать проверку некоторой, возможно, сократимой дроби на то, является ли она целой степенью числа 4. Напоминаем, что дробь является положительной степенью числа 4, если ее числитель нацело делится на знаменатель и их частное равно некоторой степени числа 4, отрицательной — если знаменатель нацело делится на числитель и их частное равно некоторой степени числа 4, и нулевой — если знаменатель равен числителю.

Формат входного файла

В первой строке входного файла input.txt находятся два натуральных числа a и b (1 ≤ a, b ≤ 232) — числитель и знаменатель дроби, которую необходимо проверить на то, является ли она целой степенью числа 4.

Формат выходного файла

В первой строке выходного файла output.txt требуется вывести YES, если данная дробь является целой степенью числа 4, и NO в противном случае. В случае, если ответ YES и данная дробь равна 4k, во второй строке выходного файла необходимо вывести само число k.

Пример входных и выходных данных

input.txt output.txt
4 1
YES
1
1 4
YES
-1
3 5
NO
А вот мое решение:
Код:
var i,m,n,d:integer;
    f1,f2:text;
    a,k,s : array[1..2] of longint;
begin
    Assign(f1, 'input.txt'); Reset(f1);
    Assign(f2, 'output.txt'); Rewrite(f2);
    Read(f1,a[1],a[2]);
    a[1]:=Abs(a[1]);
    a[2]:=Abs(a[2]);
    m:=a[1]; n:=a[2];
    while not ((m=0) or (n=0)) do       // Находим Наибольший Общий Делитель
       if m>=n then m:=m-n else n:=n-m;
    if m=0 then d:=n else d:=m;
    a[1]:=a[1] div d; a[2]:=a[2] div d;  // Сокращаем на НОД
    for i:=1 to 2 do begin      // Находим предполагаемые степени
        k[i]:=1; s[i]:=0;
        While k[i]<a[i] do begin
         k[i]:=k[i]*4;
         s[i]:=s[i]+1;
        end;
    end;
    if a[1]=k[1]
           then if a[1]=a[2] then begin Writeln(f2,'YES'); Writeln(f2,0); end
             else if S[1]>S[2]
                then begin Writeln(f2,'YES'); Writeln(f2, S[1]); end
                else begin Writeln(f2,'YES'); Writeln(f2, -S[2]); end
           else Writeln(f2,'NO');
    Close(f1); Close(f2);
end.
Это более-менее похоже на правильное решение?

Последний раз редактировалось vokar97; 31.01.2013 в 20:10.
vokar97 вне форума Ответить с цитированием
Старый 01.02.2013, 00:14   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,316
По умолчанию

Хм, написал свое решение и скопировал Ваше в одной программе.
Потестировал на расхождения ответов.
Например, на тесте 1 17 Ваша программа говорит YES.

Мое решение (без файлового вывода):
Код:
var
  a, b, n: longint;
  s: integer;

function nod(a, b: longint): longint;
begin
  while (a <> 0) and (b <> 0) do
    if a >= b then
      a := a mod b
    else
      b := b mod a;
  nod := a + b;
end;

begin
  readln(a, b);
  n := nod(a, b);
  a := a div n;
  b := b div n;
  if a >= b then
    s := 1
  else
  begin
    n := a;
    a := b;
    b := n;
    s := -1;
  end;
  if (b = 1) and (a and (a - 1) = 0) then
  begin
    n := 0;
    while a and 1 = 0 do
    begin
      inc(n);
      a := a shr 1;
    end;
    if n and 1 = 0 then
      writeln('YES ', s * (n shr 1))
    else
      writeln('NO');
  end
  else
    writeln('NO');
  readln;
end.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Pascal не могу найти ошибку lialia Паскаль, Turbo Pascal, PascalABC.NET 1 21.12.2012 01:05
не могу найти ошибку! прошу помочь!:) Snake_k6 Общие вопросы C/C++ 2 02.11.2012 12:03
Delphi. Решение системы нелинейных уравнений методами Ньютона и простых итераций. Помогите найти ошибку! Sianessa Помощь студентам 8 13.04.2012 17:32
pascal найти ошибку. Айдар Помощь студентам 4 09.02.2010 20:53
Прошу помочь найти ошибку.Текст внутри BackSlash Помощь студентам 3 21.12.2009 12:13