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

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

Задача:

Дана последовательность цифр. Нужно найти сумму всех возможных чисел, которые могут быть "склеены" из этих цифр на отрезке [L;R]

Если для хранения этих цифр использовать vector<char> data, то при вычислении (1LL * data[i] * p[i]) получается RE. Меняю на vector<int> — accepted.

Считывание у меня такое:

for (int i = 0; i < n; ++i) {
    scanf("%d", &data[i]);
}

Это связано с особенностью компилятора или я что-то сделал не так?

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

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

Если ты читаешь %d, то ты должен передать int* следущим аргументом, а не char*

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

    Я думал если число влезает в char, то он нормально его запишет. Спасибо)

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

      Дело в том, что scanf() вообще не знает, какого типа параметры ему переданы. Поэтому и надо в строке формата указывать разные %d, %s вместо %1, %2. Если сделать так:

      char c;
      scanf("%d", &c);
      

      то scanf() воспримет второй аргумент как указатель на int и запишет туда целый int (скорее всего, 4 байта вместо 1). Память, которая следует после c, окажется переписанной.

      Разные форматы можно посмотреть здесь: http://en.cppreference.com/w/cpp/io/c/fscanf. И ещё надо читать предупреждения компилятора.

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

Никогда не понимал людей, которые всюду суют сканфы и принтфы. Я могу вспомнить от силы 2 задачи, где это было действительно необходимо. Неужели это так забавно — ухудшать читаемость кода и еще к тому же ловить бредовые ошибки на ровном месте?

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

    Ну, я бы не сказал, что это ухудшает читаемость кода. При использовании scanf/printf сразу видишь, как выглядит ввод/вывод, в отличие от cin/cout, где нужно вспоминать какого типа переменная используется. Плюс вариант с printf может получиться на порядок короче, чем с cout (например, вывести время в формате часы:минуты:секунды).

    На счет "ловить бредовые ошибки" — есть warnings и хорошая привычка их не игнорировать.

    Ну а так да, cin/cout круче за счет статической типизации, что к тому же должно делать его быстрее scanf/printf.

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

    Я могу вспомнить от силы 2 задачи — а я могу вспомнить примерно 5 таких задач только за последние 2 недели:)

    Или есть способ заставить cin/cout нормально работать с long long и с точным выводом double? Я не умею. Понятно, что он намного быстрее scanf/printf для int'ов, но на этом преимущества заканчиваются.