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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.07.2012, 14:14   #1
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию Драконы

И раз пошла такая пьянка, то очень хотелось выслушать Ваши предложения по поводу решения данной задачи.
И так ссыль. Для противников ссылок :
Цитата:
Известно, что у дракона может быть несколько голов и его сила определяется числом голов. Но как определить силу драконьей стаи, в которой несколько драконов и у каждого из них определенное число голов? Вероятно, вы считаете, что это значение вычисляется как сумма всех голов? Это далеко не так, иначе было бы слишком просто вычислить силу драконьей стаи. Оказывается, что искомое значение равно произведению значений числа голов каждого из драконов. Например, если в стае 3 дракона, у которых 3, 4 и 5 голов соответственно, то сила равна 3*4*5 = 60. Предположим, что нам известно суммарное значение голов драконьей стаи, как нам вычислить максимально возможное значение силы этого логова драконов? Именно эту задачу Вам и предстоит решить.
Входные данные

В единственной строке входного файла INPUT.TXT записано натуральное число N (0 < N < 100) – количество голов драконьей стаи.
Выходные данные

В единственную строку выходного файла OUTPUT.TXT нужно вывести максимально возможное значение силы, которая может быть у стаи драконов из N голов.
Мое решение :
Код:
var
        a : array [1..100] of Integer;
        n, i, count : Integer;
        r : Int64;

begin
        assign(input, 'input.txt'); reset(input);
        assign(output, 'output.txt'); rewrite(output);

        ReadLn (n);
        if n = 0 then
            WriteLn (0)
        else if n = 1 then
            WriteLn (1)
        else begin
        count := 1;
        while n > 0 do begin
            if (n - 3 >= 2) or (n - 3 = 0) then begin
                    a[count] := 3;
                        n := n - 1
                end
                else
                    a[count] := 2;
                n := n - 2;
                Inc (count)
        end;

    r := 1;
        for i := 1 to count - 1 do
            r := a[i] * r;

        WriteLn (r)
    end
end.
Poma][a вне форума Ответить с цитированием
Старый 13.07.2012, 15:42   #2
Plague
Забанен
Форумчанин Подтвердите свой е-майл
 
Аватар для Plague
 
Регистрация: 01.11.2006
Сообщений: 420
По умолчанию

Время считать будем?) тут массивы не нужны!
Число голов может быть 3 или 2!
Если ничто другое не помогает, прочтите, наконец, инструкцию! Аксиома Кана

Последний раз редактировалось Plague; 13.07.2012 в 15:46.
Plague вне форума Ответить с цитированием
Старый 13.07.2012, 15:47   #3
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Цитата:
Время считать будем?
извините, но я Вас не понимаю...
Цитата:
тут циклы не нужны!
Тогда не могли бы Вы подсказать более оптимальный вариант?
Poma][a вне форума Ответить с цитированием
Старый 13.07.2012, 15:55   #4
Plague
Забанен
Форумчанин Подтвердите свой е-майл
 
Аватар для Plague
 
Регистрация: 01.11.2006
Сообщений: 420
По умолчанию

поправил
1) вводим N
2) вычитаем из N 3 пока не N не будет меньше или равно 4
3) дальше разбираем случаи что будет при меньше или равно 4

пример:
6=3-3 -> ответ 3*3 = 9
7=3-2-2 -> ответ 3*2*2 =12
8=3-3-2-> ответ 3*3*2 = 18

выводим ответ!
Если ничто другое не помогает, прочтите, наконец, инструкцию! Аксиома Кана
Plague вне форума Ответить с цитированием
Старый 13.07.2012, 16:32   #5
Arhangel7
Пользователь
 
Регистрация: 27.02.2010
Сообщений: 90
По умолчанию

Код:
var
  F1, F2: TextFile;
  E:extended;//ответ
  A,C,N:Integer;
begin
  AssignFile(F1,'INPUT.TXT');
  AssignFile(F2,'OUTPUT.TXT');
  reset(F1);
  readln(F1,N);
  Close(F1);
  Case N of
    1: E:=1;
    2: E:=2;
    3: E:=3;
    4: E:=4;
    else
    begin
      A:=N DIV 3;
      C:=N-A*3;
      Case C of
        0: E:=Power(3,A);
        1: E:=Power(3,A-1)*4;
        2: E:=Power(3,A)*2;
      end;
    end;
  end;
  Rewrite(F2);
  writeln(F2,E:0:0);
  close(F2);
end.
как-то так
Arhangel7 вне форума Ответить с цитированием
Старый 13.07.2012, 16:49   #6
Plague
Забанен
Форумчанин Подтвердите свой е-майл
 
Аватар для Plague
 
Регистрация: 01.11.2006
Сообщений: 420
По умолчанию

ну раз решения пошли)

вариант 1:
Код:
var s,n:int64;
begin
  read(n);  
  s:=1;
  while n>4 do 
    begin
      s:=s*3;
      n:=n-3;
    end;
  s:=s*n;
  write(s);
end.
вариант 2:
Код:
var s:extended;
    n,a,b:integer;
begin
  read(n);
  a:=n mod 3;
  b:=(n-2) div 3;
  if a<>2 then a:=a+3;
  s:=a*exp(b*ln(3));
  write(s:0:0);
end.
Если ничто другое не помогает, прочтите, наконец, инструкцию! Аксиома Кана

Последний раз редактировалось Plague; 13.07.2012 в 19:35.
Plague вне форума Ответить с цитированием
Старый 13.07.2012, 17:01   #7
Arhangel7
Пользователь
 
Регистрация: 27.02.2010
Сообщений: 90
По умолчанию

как можно проверить затраченое время на выполнение программы(кода) или чем?
как-то так
Arhangel7 вне форума Ответить с цитированием
Старый 13.07.2012, 20:13   #8
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Огромное спасибо! Буду разбираться!

Цитата:
как можно проверить затраченое время на выполнение программы(кода) или чем?
можно отправить на сайт(ссылка в 1 посте), НО как сказал уважаемый TinMan
Цитата:
Что касается тестов - лучше синтезировать их самому, с акцентом на то, что проверяешь (быстродействие, например).

Цитата:
Число голов может быть 3 или 2!
Код:
if (n - 3 >= 2) or (n - 3 = 0) then begin
                    a[count] := 3;
                        n := n - 1
                end
                else
                    a[count] := 2;
                n := n - 2;
Цитата:
Вариант 1
Он по Вашей выше изложенной схеме (почти) и алгоритм решения ясен.
Цитата:
Вариант 2
А вот тут запарка, не могли бы Вы его прокоментировать?

Цитата:
var s:extended; // сам ответ
n,a,b:integer; // n - кол-во голов, a - остаток числа от деления на 3(может быть либо 0, либо 2), b - (n-2) div 3, честно говоря, не понимаю что здесь написано (смысл)
И наверно нужно добавить развилочку, т.к. Ваш алгоритм рушится при тесте, где входные данные = 1

И еще один глупый вопрос ни как не касающийся данной темы (прошу помиловать, но ради него и тему создавать - грех) наткнулся на такие строки
Цитата:
Далее, goto - ТАБУ. А показывать их школьникам - преступление )).
Сказал данную фразу премного уважаемый,TinMan,далее не менее премного уважаемый Serge высказал своё мнение по данному поводу :
Цитата:
заканчивая использованием goto! (фи! )
еще очень много раз Гении Программирования увековечили данный оператор(читаю из вики(<> справка) => могу ошибаться) киданием помидорами и возник вопрос за что его все так не взлюбили, поиск (и по форуму и в гугле) молчит(= мудрых мыслей и объяснений не находит). И очень хочется узнать что же это такое? С чем его едят? И почему одно его упоминание сразу выражает недогование(смогу подставить своё лицо для тех же, не слишком свежих томатов, сказав что не всех программистов(если их вообще можно так назвать), но 2 Кита Программирования, в одной теме так "обижают" владельца запрещенного goto, что это наводит на некоторые мысли)?

Последний раз редактировалось Stilet; 16.07.2012 в 20:30.
Poma][a вне форума Ответить с цитированием
Старый 16.07.2012, 12:36   #9
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,309
По умолчанию

К вопросу о goto (естественно мое представление).
История этого оператора уходит в далекое прошлое, когда языки высокого уровня только зарождались. Как пример ВАСИК
Ежели начинать с глубоких корней, то, на примере моего товарища - выпускника московского ВУЗа, программиста по специализации, когда он писал в коде (нет, не на ассемблере, а имеено в коде Электроника 100И или Электроника 60), то в силу не всегда правильного распределения памяти, которой было не много (ну очень мало) он продолжал код, который упирался в область отведенную им под данные, командой Jmp (а это уже из ассемблера - эквивалент goto).

{тут область кода}
Jmp M;
{тут область данных}
М: {тут продолжение кода}

И таких скачков, порой, было несколько.

Продолжу о ЯВУ. В первых версиях Basic все строки нумеровались и оператор goto позволял просто решать вопросы перехода.
К тому же, операторов выхода из цикла либо не было, либо их перечень был мал. Посмотрите на современный VB или Delphi.

Очевидно, что чтение такого кода весьма затруднительно даже для того, кто его писал. Как правило, не ясен смысл такого перехода.
Структурирование программы и привело к превращению этого оператора в изгоя.
Порой представление об этом операторе таково, что человек, увидев, например, процедуру с именем GoToXY, начинает слегка морщица.
На мой взгля, конечно же использование оператора goto в 99.99% не оправдано с точки зрения читабельности кода, но в жизни так случается, что даже совершенно бесполезная вещь становится незаменимой. Оператор goto можно использовать в тех случаях, когда необходимо выйти из группы вложенных циклов или когда нет подходящего оператора для ветвтления: кто писал bat-файлы без этого оператора?

Ну, накатал, ...
Как то так, ....
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 16.07.2012, 18:43   #10
Plague
Забанен
Форумчанин Подтвердите свой е-майл
 
Аватар для Plague
 
Регистрация: 01.11.2006
Сообщений: 420
По умолчанию

s = a * 3^b
b - степень.
Я знаю что при 1 не работает. Доработать думаю там пару секунд.
Если ничто другое не помогает, прочтите, наконец, инструкцию! Аксиома Кана
Plague вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
задача-драконы evgeniyvol Паскаль, Turbo Pascal, PascalABC.NET 3 06.12.2011 14:45