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

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

Как известно в Codeforces нельзя использовать для чтения 64-битных чисел на С++ спецификатор %lld, а рекомендуется использовать %I64d. Как мне известно это связано с ОС сервера. Если у сервера Windows, то I64d, а если Linux, то %lld. Но если мы хотим автоматически определять, что использавать, I64d или %lld, можно записать код так:

if (defined(WIN32) || !defined(__GNUC__))

#define I "%I64d"

#else

#define I "%lld"

endif

Тогда можно писать так : scanf(I, x); и printf(I, x); Но при попытке сдать такой код предъявят ,что вы используете %lld. Почему??? Ведь используя выше код, автоматически будет использоваться либо %I64d, либо %lld, зависит от ОС проверяющего компютера. Прошу ответить администраторов.

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

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

Потому что ищется по подстроке ибо парсер адекватный написать не слишком легко(и не слишком полезно). как work around можно юзать define l "%l" "ld"

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

Потому что при отправке проверка происходит следующим образом:

if (sourceCode.contains("%lld"))
    showWarning();

Никто не будет проверять, используется ли оно на самом деле, т.к. это технически очень трудно или даже невозможно.

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

    В принципе это возможно. Но по сути это все равно, что написать компилятор)

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

      Это невозможно в принципе. Известный факт, что не существует алгоритма который бы по программе представленной на некотором языке делал заключение завершиться ли она за конченое время, или будет работать бесконечно долго. Очевидно, что задача определения того выведется ли через "lld" хоть что-нибудь, не проще, и потому она также не разрешима.

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

        Да я знаю про задачу останова. Но тут немного другое.

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

        Вопрос не в том, выведется ли через нее что-нибудь, а используется ли она в каком-нибудь вызове scanf или printf

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

      По-моему здесь достаточно было бы просто пропустить через препроцессор исходный код :) по крайней мере компилятор не нужен

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

То что вы видели это не ошибка при желании вы все равно можете отправить код с %lld. Это просто предупреждение, чтобы вы убедились что все хорошо.

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

    Более того, там даже есть вроде галка: "Не показывать это предупреждение".

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

Вообще насколько я понимаю, %I64 — это особенность библиотеки msvcrt, с которой линкуется программа. Причём последние версии, поддерживают оба варианта (%I64d и %lld), но на тестирующем сервере, по видимости, стоит более старая версия.