如何扫描C中最多10 ^ 18位数的数字

时间:2018-04-09 18:32:29

标签: c

没有数据类型可以存储如此大的数字。使用数组 int a[pow(10,pow(10,18))]再次赢得了这项工作,因为pow()返回doubledouble无法存储10^(10^18)

有任何想法吗?

我试图解决the following problem

考虑带N的整数 数字(十进制表示法,不带前导零)D 1 ,D 2 ,D 3 ,...,D N 。这里,D 1 是最高有效数字,D N 是最不重要的数字。该整数的权重定义为:

Σi= 2 - > N(D i -D i-1 )。

给出整数N和W.找到具有N位数(不带前导零)且权重等于W的正整数的数量。以10 9 +7计算此数字。

输入:

输入的第一行包含一个整数T,表示测试用例的数量。下面是T测试用例的描述。 每个测试用例的第一行和唯一一行包含两个以空格分隔的整数N和W,表示位数和所需的权重。

输出:

对于每个测试用例,打印一行包含一个整数 - 重量为W的N位正整数,模数10 9 +7。

约束:

  • 1≤T≤10 5
  • 2≤N≤10 18
  • | W |≤300

3 个答案:

答案 0 :(得分:7)

您不需要存储10 ^ 18位数字。看一下重量的定义:

Σi= 2 - > N(D i -D i-1

总和中的每个元素是两个连续数字的差异。

让我们以4位数字为例,其数字为D 1 ,D 2 ,D 3 ,D <子> 4 。然后总和是:

(D 2 - D 1 )+(D 3 - D 2 )+(D < sub> 4 - D 3

修改操作数:

D 4 - D 3 + D 3 - D 2 + D 2 - D 1

您会看到除了第一个和最后一个数字之外的所有数字都会被取消!所以总和是D 4 - D 1 。实际上,对于任意数量的数字N,总和是:

D N - D 1

因此只有第一个和最后一个数字是相关的。你应该能够从中找出其余部分。

答案 1 :(得分:0)

有用于处理这些问题的库,例如The GNU Multiple Precision Arithmetic Library

  

什么是GMP?

     

GMP是一个用于任意精度算术的免费库,对有符号整数,有理数和浮点数进行操作。精度没有实际限制,除了机器GMP中可用内存所暗示的那些限制。 GMP具有丰富的功能,并且功能具有常规接口。

     

GMP的主要目标应用是加密应用和研究,互联网安全应用,代数系统,计算代数研究等。

但是10 ^ 18会占用巨大的(并且实际上是不可能的)内存量(如果我的数学是正确的:2.881 EiB)。

答案 2 :(得分:0)

referenced problem2 ≤ N ≤ 10^18获取输入。这不是10 ^ 18位数(或10 ^ 10 ^ 18,这是荒谬的巨大)但是18位数或2到1,000,000,000,000,000,000。这将适合64位整数,有符号或无符号。

使用int64_t from stdint.h

10 ^ 18正在推动64位整数的极限,这可能是他们选择它的原因。任何更大的内容都应使用arbitrary precision mathGMP库。

......但是有限制。简单地存储这样的数字将需要大约100万千兆字节。因此,虽然问题在于解决10 ^ 18位数的数字,但我强烈怀疑你不应该通过实际存储这些数字来解决它。你应该采用一些数学技术。