• Пират положил в сундук некоторое количество золотых монет. На второй год он вынул из сундука сколько-то монет. Начиная с третьего года, он добавлял столько монет ,сколько было в сундуке два года назад.
    Требуется написать программу, которая определит, сколько монет было в сундуке в первый и во второй год , в сундуке будет 5,2,7,9,,16,25 .... монет.
    Формат входного файла:
    Входной файл INPUT.TXT содержит числа Х (3<=X<=20) и Y(1<=Y<=32767), записанные через пробел .
    Формат выходного файла:
    В выходной текстовый файл OUTPUT.TXT записываются через пробел количество монет в первый и второй года. Гарантируется, что решение всегда есть. Если решений несколько, то вывести любое.

Ответы 1

  • 1. Вопрос задан коряво. Задача эта называется сундук Билли Бонса, ряд 5,2,7,9,16,25 - это пример последовательности числа монет в сундуке, если в первый год монет пять, во второй - две.2. Вот программка на АБС-Паскале, не оптимальная по ряду моментов, но рабочая. Из особенностей - выводит решения только если если во второй год монет становится меньше, чем в первый. Существуют решения при нулевом количестве взятых во второй год монет и при отрицательном. Если такие решения нужны - то условие в  "if (j div n) < i then" надо изменитьПрограммка неэффективна, вместо решения диофантова уравнения по Евклиду используется тупой перебор, но по условиям он ограничен, и его можно себе позволить.Выводятся также все решения, если нужно одно - прерывайте цикл по нахождению первого.---------------------program БиллиБонс;//const  maxYear = 20;  maxMoney = 32767;var  a, b: array [1..maxYear] of integer;  m, n, x, y: integer;  f1, f2: text;  s: string;begin    assign(f1, 'input.txt');   // устанавливаем связь между файловой переменной и путем к файлу  reset(f1);  // открытие на чтение файла  read(f1, x);  read(f1, y);  close(f1); // закрываем файл    // Заполняем массив коэффициентов  a[1] := 1;b[1] := 0;  a[2] := 0;b[2] := 1;  for var i := 3 to maxYear do  begin    a[i] := a[i - 1] + a[i - 2];    b[i] := b[i - 1] + b[i - 2];  end;    m := a[x];n := b[x];  // решаем уравнение m*s1 + n*s2 = y  // m,n - коэффициенты, зависящие от номера года  // s1,s2 - монет в первый и второй годы    assign(f2, 'output.txt');   // устанавливаем связь между файловой переменной и путем к файлу  rewrite(f2);  // создание (перезапись) файла    for var i := 1 to y div m do   // цикл по s1  begin    var j := y - m * i;    if j mod n = 0 then      if (j div n) < i then      begin        writeln('s1=', i, ' s2=', j div n);        writeln(f2, i, ' ', j div n);  // вывод данных в файл      end;  end;    close(f2); // закрываем файлend.
  • Добавить свой ответ

Войти через Google

или

Забыли пароль?

У меня нет аккаунта, я хочу Зарегистрироваться

How much to ban the user?
1 hour 1 day 100 years