我正在解决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;
}
生成的输出问题是我要求用户输入必须输入到数组中的元素数。但该计划不希望如此。它希望我们通过流输入所需的数字,但我无法这样做。另外,我对“输入流的大小”感到困惑。这个“输入流的大小”是什么意思?你能帮我取悦吗?
答案 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::vector
,std::deque
或std::list
也适用。
如果您不想使用标准库容器,可以使用数组并跟踪其中有多少个有效值。那么如何确定阵列的最大尺寸?您可以使用输入流的给定大小作为线索。 256 KB表示262144个字符。每个整数(第一个除外)必须占用至少2个字符,1表示单个数字,1表示将其与前一个整数分开的空间。因此,流最多可以包含262144/2
个整数。
另请注意,输入范围表示您需要64位或更大的整数。在当今的大多数系统中,int
不满足此要求。 long long
确实如此。或者,您可以加入<cstdint>
并使用int64_t
。