C ++ - 输入流的大小

时间:2013-06-01 21:49:46

标签: c++

我正在解决problem,其中输入流包含一组整数Ai(0≤Ai≤10^(18))。数字由任意数量的空格和换行符分隔。输入流的大小不超过256 KB。

我的代码如下: -

#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;
}

生成的输出问题是我要求用户输入必须输入到数组中的元素数。但该计划不希望如此。它希望我们通过流输入所需的数字,但我无法这样做。另外,我对“输入流的大小”感到困惑。这个“输入流的大小”是什么意思?你能帮我取悦吗?

2 个答案:

答案 0 :(得分:0)

输入流的大小是输入流中的字节数。这部分代码:

int *arr=new int[index];
if(sizeof(*arr)<262144) 

不正确。 *arr是一个整数,条件将始终为true。无论如何,你需要一个堆栈:

while (read number)
   stack.push(sqrt(number))
while (stack has elements)
   print top of stack
   pop stack

输入流大小的提示建议您可以使用固定大小的基于数组的堆栈。

答案 1 :(得分:0)

这是您阅读输入流的全部内容的方式:

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::vectorstd::dequestd::list也适用。

如果您不想使用标准库容器,可以使用数组并跟踪其中有多少个有效值。那么如何确定阵列的最大尺寸?您可以使用输入流的给定大小作为线索。 256 KB表示262144个字符。每个整数(第一个除外)必须占用至少2个字符,1表示单个数字,1表示将其与前一个整数分开的空间。因此,流最多可以包含262144/2个整数。

另请注意,输入范围表示您需要64位或更大的整数。在当今的大多数系统中,int不满足此要求。 long long确实如此。或者,您可以加入<cstdint>并使用int64_t