0

我正在解决输入流包含一组整数 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;
}

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

4

2 回答 2

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 >> ncin,并且当cin(或任何其他istream对象)在布尔上下文中进行测试时,如果它处于良好状态,则评估为 true,如果处于错误状态,则评估为 false。所以上面的循环本质上意味着继续读取cin直到cin被置于错误状态,这在输入流耗尽时发生。

因此,您不需要从一开始就知道流中有多少数字,您只需阅读直到失败。您需要的是一种可以动态扩展以适应您可能收到的所有数字的数据结构,就像标准库中的任何容器一样。std::stack似乎很符合要求,但是std::vector, std::dequeorstd::list也可以。

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

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

于 2013-06-01T22:12:12.203 回答
0

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

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

关于输入流大小的提示表明您可以使用具有固定大小的基于数组的堆栈。

于 2013-06-01T21:58:57.550 回答