Вопрос:
Я решаю проблему, когда входной поток содержит набор целых чисел Ai (0 ≤ Ai ≤ 10 ^ (18)). Номера разделяются любым количеством пробелов и разрывов строк. Размер входного потока не превышает 256 КБ.
Мой код выглядит следующим образом:
#include<math.h> #include<iostream> using namespace std; int main(void) { long int index,i; cin>>index; int *arr=new int[index]; if(sizeof(*arr)<262144) // 262144 = 256*1024 bytes which I think might be the size of the array { for(i=0;i<index;i++) cin>>*(arr+i); for(i=index-1;i>=0;i—) cout<<sqrt(*(arr+i))<<endl; } else return -1; return 0; }
Проблема с полученным результатом состоит в том, что я требую, чтобы пользователь вводил количество элементов, которые должны быть введены в массив. Но программа этого не хочет. Он хочет, чтобы мы вводили требуемые номера через поток, но я не могу этого сделать. Кроме того, меня смущает “размер входного потока”. Что означает этот “размер входного потока”? Можете ли вы мне понравиться в этом?
Ответ №1
Размер входного потока – это количество байтов во входном потоке. Эта часть вашего кода:
int *arr=new int[index]; if(sizeof(*arr)<262144)
не является правильным. *arr – целое число, и условие всегда будет истинным. Во всяком случае, вам нужен стек:
while (read number) stack.push(sqrt(number)) while (stack has elements) print top of stack pop stack
Подсказка о размере входного потока предполагает, что вы можете использовать стек на основе массива с фиксированным размером.
Ответ №2
Вот как вы читаете все содержимое входного потока:
int n; while (cin >> n) // this test will fail when we reach the end of the stream { // do something with n }
Как это работает:
Когда конец входного потока будет достигнут, операция cin >> n завершится с ошибкой. Это ставит cin в состояние ошибки. Значение, возвращаемое выражением cin >> n является cin, и когда cin (или любой другой объект istream) тестируется в булевом контексте, он вычисляет true, если он находится в хорошем состоянии, и false, если он находится в ошибке государство. Таким образом, вышеприведенный цикл по существу означает, что чтение будет продолжаться с cin до тех пор, пока cin будет введен в состояние ошибки, которое произойдет, когда поток ввода будет исчерпан.
Таким образом, вам не нужно знать, сколько чисел в потоке с самого начала, вы просто читаете до сбоя. Вам нужна структура данных, которая может динамически расширяться для размещения всех номеров, которые вы могли бы получить, например, любой из контейнеров из стандартной библиотеки. std::stack похоже, красиво подходит для счета, но std::vector, std::deque или std::list тоже будет работать.
Если вы не хотите использовать стандартные библиотечные контейнеры, вы можете просто использовать массив и отслеживать, сколько действительных значений в нем. Итак, как определить максимальный размер массива? Вы можете использовать заданный размер для входного потока в качестве ключа. 256 КБ означает 262144 символов. Каждое целое число (кроме первого) должно занимать не менее 2 символов, 1 для одной цифры и 1 для пробела, отделяющего его от предыдущего целого. Таким образом, поток может содержать не более 262144/2 целых чисел.
Также обратите внимание, что диапазон ввода указывает, что вам понадобятся 64-битные целые числа или больше. В большинстве систем в настоящее время int не удовлетворяет этому требованию. long long делает хотя. Или вы можете включить <cstdint> и использовать int64_t.