Задача:
Дана последовательность цифр. Нужно найти сумму всех возможных чисел, которые могут быть "склеены" из этих цифр на отрезке [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]);
}
Это связано с особенностью компилятора или я что-то сделал не так?
Если ты читаешь %d, то ты должен передать int* следущим аргументом, а не char*
Я думал если число влезает в char, то он нормально его запишет. Спасибо)
Дело в том, что
scanf()
вообще не знает, какого типа параметры ему переданы. Поэтому и надо в строке формата указывать разные%d
,%s
вместо%1
,%2
. Если сделать так:то
scanf()
воспримет второй аргумент как указатель наint
и запишет туда целыйint
(скорее всего, 4 байта вместо 1). Память, которая следует послеc
, окажется переписанной.Разные форматы можно посмотреть здесь: http://en.cppreference.com/w/cpp/io/c/fscanf. И ещё надо читать предупреждения компилятора.
Никогда не понимал людей, которые всюду суют сканфы и принтфы. Я могу вспомнить от силы 2 задачи, где это было действительно необходимо. Неужели это так забавно — ухудшать читаемость кода и еще к тому же ловить бредовые ошибки на ровном месте?
Ну, я бы не сказал, что это ухудшает читаемость кода. При использовании scanf/printf сразу видишь, как выглядит ввод/вывод, в отличие от cin/cout, где нужно вспоминать какого типа переменная используется. Плюс вариант с printf может получиться на порядок короче, чем с cout (например, вывести время в формате часы:минуты:секунды).
На счет "ловить бредовые ошибки" — есть warnings и хорошая привычка их не игнорировать.
Ну а так да, cin/cout круче за счет статической типизации, что к тому же должно делать его быстрее scanf/printf.
http://google-styleguide.googlecode.com/svn/trunk/cppguide.html#Streams, например
Я могу вспомнить от силы 2 задачи — а я могу вспомнить примерно 5 таких задач только за последние 2 недели:)
Или есть способ заставить cin/cout нормально работать с long long и с точным выводом double? Я не умею. Понятно, что он намного быстрее scanf/printf для int'ов, но на этом преимущества заканчиваются.
А что за проблемы у cin/cout с long long и double?
Ощутимое отставание в быстродействии по сравнению с printf/scanf. Можно посмотреть, например, эту тему.
Насчёт даблов действительно вижу оставание порядка 1.5 раза.
А вот для long long получилось наоборот ускорение. В тестах из приведённой темы long long нет, возможно я что-то неправильно переписал, но вот эта программа выдаёт мне
Если точный вывод double, это вывод 8 знаков после запятой, то вот так:
в одну строчку удобнее и читабельнее