【问题标题】:C++ - Size of an input streamC++ - 输入流的大小
【发布时间】:2013-06-01 21:49:46
【问题描述】:

我正在解决一个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;
}

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

【问题讨论】:

  • 您不需要数组来执行此操作。只需阅读和处理。
  • 我猜它假设你使用stack 数据结构。
  • 但是我不需要知道流中有多少和哪些数字吗?如果是,那么我应该如何使用标准 I/O 流来做到这一点?
  • 我认为“输入流的整体大小”是一个红鲱鱼。与问题无关
  • “输入流的大小”没有任何意义。输入流可以无限长。它与您的问题无关。

标签: c++


【解决方案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 &gt;&gt; n 将失败。这会使cin 进入错误状态。表达式cin &gt;&gt; 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 确实如此。或者您可以包含&lt;cstdint&gt; 并使用int64_t

    【讨论】:

      猜你喜欢
      • 2012-07-29
      • 2011-08-31
      • 2012-06-28
      • 1970-01-01
      • 2021-10-08
      • 1970-01-01
      • 1970-01-01
      • 2016-02-10
      • 2017-03-11
      相关资源
      最近更新 更多