Блог пользователя jaguar1996

Автор jaguar1996, 9 лет назад, По-русски

Всем привет.

Недавно решил освоить метод рекурсивного спуска, нашел задачу http://informatics.mccme.ru/mod/statements/view3.php?id=11575&chapterid=112500 , написал код который прошел 10 тестов из 21. Попытался сдать на питоне, опять таки 10 из 21. Хотел спросить, кто нибудь сдавал эту задачу? Если да подскажите, может там есть хитрость какая то, которую я не могу понять

  • Проголосовать: нравится
  • +5
  • Проголосовать: не нравится

»
9 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Я думаю, ребятам хотелось бы увидеть твой код, ибо так будет проще понять, что в твоём коде не так

  • »
    »
    9 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится +15 Проголосовать: не нравится

    from math import *

    s = input()

    exec('print("%.3f" % (' + s + '))')

    • »
      »
      »
      9 лет назад, # ^ |
      Rev. 2   Проголосовать: нравится +5 Проголосовать: не нравится

      Что выдаст на 5/2 ?

      UPD: Ок, на третьем питоне все ок, а на втором падает.

    • »
      »
      »
      9 лет назад, # ^ |
        Проголосовать: нравится +29 Проголосовать: не нравится

      я не майстер в пітоні але як я зрозумів exec робить обчислення твоєї строки,просто проходили цю тему,це можна в гуглі вбити як "дерево выражений" і воно тобі видасть багато на цю тему,просто робиш 4 функції,які викликають одна в іншій,перша рахує (+,-) друга рахує (*,/) третя sin,cos,abs,sqrt,четверта має рахувати значення в дужках,формально ці 4 функції задають пріоритет операцій(коли будеш гуглити побачиш) а так це досить великий код,і досить кропітка робота,ну удачі і вибач за моє погане знання російської

      • »
        »
        »
        »
        9 лет назад, # ^ |
        Rev. 4   Проголосовать: нравится -7 Проголосовать: не нравится

        "вибач за моє погане знання російської" — извини, не заметил эту строку:(

      • »
        »
        »
        »
        9 лет назад, # ^ |
        Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

        Я не знаю украинский но догадываюсь о чем ты говоришь) Я реализовал метод рекурсивного спуска так :

        1. <Выражение> = <Слагаемое>{(+|-)<Слагаемое>}

        2. <Слагаемое> = <Множитель>{(*|/)<Множитель>}

        3. <Множитель> = (+|-) <ДробноеЧисло>|<Функция>|(<Выражение>)

        4. <ДробноеЧисло> = <ЦелаяЧасть>|<ЦелаяЧасть>.<ДробнаяЧасть>

        5. <ЦелаяЧасть> = <Цифра>|<Цифра><Цифра>

        6. <ДробнаяЧасть> = <Цифра>|<Цифра><Цифра>

        7. <Функция> = <ИмяФункции>(<Выражение>)

        8. <ИмяФункции> = "sin"|"cos"

        9. <Цифра> = 0|1|2|3|4|5|6|7|8|9

        Видимо тут чего то нет, мне надо понять чего именно

        • »
          »
          »
          »
          »
          9 лет назад, # ^ |
          Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

          <ЦелаяЧасть> = <Цифра>|<Цифра><Цифра>

          Мб.

          <ЦелаяЧасть> = <Цифра>|<Цифра><Целая часть> ?

          <ИмяФункции> = "sin"|"cos" <- тут еще есть варианты

          • »
            »
            »
            »
            »
            »
            9 лет назад, # ^ |
              Проголосовать: нравится 0 Проголосовать: не нравится

            Эти пункты скопипастил не всматриваясь, ну а по факту sin cos abs sqrt реализовал и дробное число рассматривать вообще не надо, так как в той задаче гарантированы на вход целые числа

        • »
          »
          »
          »
          »
          9 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится

          останній комент був про eval,я подумав що можливо це с++ функція,загуглив і чуда не відбулось,але натрапив на 2 статті в вікіпедії з детальним описом ,щоправда на англійській,в мене з нею проблем менше) https://en.wikipedia.org/wiki/Recursive_descent_parser http://en.wikipedia.org/wiki/Shunting-yard_algorithm

    • »
      »
      »
      9 лет назад, # ^ |
      Rev. 2   Проголосовать: нравится +5 Проголосовать: не нравится

      Зачем exec? Вот код, который заходит на втором питоне:

      from math import *
      print '%.3f' % input()
      
      • »
        »
        »
        »
        9 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится

        Спасибо, а вы знаете чем отличается мой код от того который заходит у вас? Мне надо переделать свой сишный код который работает как тот что на питоне

        • »
          »
          »
          »
          »
          9 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится

          Хм, а вообще-то во втором питоне деление целочисленное ведь, так что не знаю, почему такой код прошёл xD

          Ведь там требование "Результат операции деления – вещественное число".

    • »
      »
      »
      9 лет назад, # ^ |
      Rev. 2   Проголосовать: нравится +5 Проголосовать: не нравится

      Для вычисления значения выражения предназначен eval:

      print(eval('3/5'))