【问题标题】:2 pow X using large integers2 pow X 使用大整数
【发布时间】:2012-03-05 20:35:16
【问题描述】:

我的作业有点问题。用户输入 X(整数 1

我明白了这个概念,我只需要不断加倍 2 'x' 次才能得到答案,但我不知道如何将它存储在数组中,以及当说 8 加倍你得到 16 时如何处理, 长乘法你需要进位不是吗?

如果收到任何帮助,我们将不胜感激。

所以总的来说我的问题是:

  1. 如何读取X的输入。我是否scanf("%s")并存储在数组中?
  2. 存储后,如何进行加倍(因为底数始终为 2)

【问题讨论】:

  • 你有没有考虑过使用所谓的 bignum 库,比如GNU multiple precision arithmetic library
  • 这是两个不同的问题,您应该分别提出。
  • 不幸的是,我不允许使用 bignum 库
  • 这是作业吗?如果是这样,请相应地标记它。提示:如果您只需要打印数字,您实际上不需要将整个内容存储在内存中。您只需要找到 2^x 的十进制表示。
  • 在作业标签上注明meta discussion

标签: c


【解决方案1】:

1。 读取输入应该不是问题。如您所知,1 scanf("%d", &x);。

2。 既然不允许使用 bignum 库,为什么不自己制作一个呢?您可以将一个大数字逐位存储在ints 或chars 的数组中。从这样的开始:

int product[100] = { 1 };

也就是说,您最初将 2^0 = 1 存储在产品中。然后你可以从左到右进行乘法:将pruduct的每个元素乘以2,模10。如果出现进位,则将其添加到下一个元素。

完成后,找出从右到左搜索的最高有效数字。然后反转数字,或者只是以相反的顺序打印它们。您还可以在最重要的一端使用标记。每当在最高有效位发生进位时,标记将递增。

可以通过每个元素存储多个数字(例如每个元素 6 个数字)来减小数组大小。然后你需要将每个元素乘以 2,模 1000000。

代码是这样的:

for(p = 0; p < x; p++)
{
    carry = 0;
    for(i = 0; i < 100; i++)
    {
        z = product[i] * 2 + carry;
        product[i] = z % 10;
        carry = z / 10;
    }
}

for(i = 99; product[i] == 0; i--);
for(; i >= 0; i++)
    printf("%d", product[i]);

【讨论】:

  • 当你说乘积的每个元素乘以 2,模 10。我会在一行上做吗?例如在 for 循环中直到 X.product[i] = product[i] * 2 % 10
  • 我的产品阵列应该有多大?如果我想存储多达 10000 个数字,数组的大小是否为 10000?
  • @Paul 当然!但是如果你想让它动态化(并且如果你被允许),你可以使用来自 STL 的vector。或者您可以通过一些简单的计算来确定大小。
  • 还有一个问题,我想我已经完成了。当我将数组的数字相加时,我不断得到随机数。例如。如果 x = 4。我打印数组并正确得到 16(向后打印数组)。但是什么时候这样做: for(i = 0; i
  • sum 初始化是否正确?
【解决方案2】:

是的,你确实需要携带 / 一个数组来存储大整数;这就是 GMP 的工作原理。

这并不像听起来那么难实现。在使用汇编时,特别是x86,甚至还有一些特殊指令(adcsbc)设置进位标志(CF)。

在 C 语言中,你不能使用这些,不幸的是,这就是 GMP 所做的。作为一组提示,这里有一些提示:

  • #include &lt;stdint.h&gt; 如果您可以使用 (C99),您将能够保证整数的宽度,例如uint32_t
  • 这行得通:

    uint64_t x = (uint64_t) a + (uint64_t) b;
    

    其中 a 和 b 是 uint32_t

  • 如果你仔细想想上面的说法,你可以根据需要从x中提取进位。

  • 对于一个大整数的存储,在学校你可能学过“百、十和单位”,即填满一个桶直到它达到 10,然后进行进位的概念。这与对大小为 2^32 的整数做同样的事情没有什么不同,只是看起来有点不自然!

  • 就像那样,基本的 bignum 操作涉及分别处理每个单元级别。
  • 这也称为不同基数的算术。将基数 8(八进制数)、基数 16(十六进制)与基数 2^32 的概念进行比较。
  • 出于性能原因,我在此处使用的类型和大小可能无法在实践中使用/使用,但这个概念是成立的。

【讨论】:

    猜你喜欢
    • 2012-04-29
    • 1970-01-01
    • 2021-04-08
    • 2015-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-30
    • 1970-01-01
    相关资源
    最近更新 更多