如何读取大量数字?涉及 IT 技术。

4

我需要在 C/C++ 中读取大量的大数字(每个数字最多22个字符,数量高达2^24)。如何进行这样的读取?数字之间用空格分隔,并且我必须一直读取到换行符。是使用getch()并填充一个数组还是有更聪明的解决方案?


2
将文件映射到内存,然后使用指针算术运算? - Some programmer dude
C 还是 C++?如果使用 C++,请使用流和向量。 - TZHX
从标准输入还是文件中读取?你想使用C还是C++? - Mike
这需要从标准输入读取。Mike,TZHX它可以是C ++。 - deha
3个回答

4
这些“数字”是什么?如果它们是整数,C语言通常没有内置支持如此大的数字;你需要使用一些“bignum”库来支持。如果它们是浮点数,你可以尝试使用double,但精度可能不够。
没有更多关于数据的信息,很难给出更具体的建议,请考虑在问题中展示一些数字,否则会非常模糊。

我将使用GMP来处理它们,所以我目前的担心是将它们读取为字符串。 - deha
通常它们将是整数。 - deha

2
如果您的读取是单线程的,可以使用getchar_unlocked()函数来避免每次操作锁定流所带来的开销。逐个字符地累加数字,并等待空格。当看到空格时,保存数字并将当前值清零:
int *data = new int[MAX_LEN];
int *ptr = data;
int ch;
*ptr = 0;
while ((ch = getchar_unlocked()) != '\n') {
    if (ch == ' ') {
        ptr++;
        *ptr = 0;
    } else {
        *ptr = (*ptr *10) + (ch -'0');
    }
}

当然,这个片段忽略了“不重要”的内容,比如错误检查,但是当您的输入被“净化”时,它是可以接受的。例如,类似这样的代码可以在ACM在线评测中节省I/O成本。


0
首先,您需要一个合适的类型来存储整数,因为它比64位int更大,您可能需要一个结构化类型。您可以编写自己的代码或使用库,例如

http://gmplib.org/

阅读相关文档以了解使用方法。

接下来,您需要明确想要对数字执行什么操作:求和、转换、搜索或传输?一旦确定,您可以在整数所使用的数据类型上进行操作。


我将需要使用您提到的GMP进行一些基本计算(如平均值)。 - deha
你可能还需要一个字符串缓冲区,在将字符验证并解析为数字之前存储它们。 - admiring_shannon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接