2 pow X使用大整数

时间:2012-03-04 12:43:18

标签: c

我的任务有点问题。用户输入X(整数1 <= x <= 10000)。然后我必须用x计算2的幂,将答案的所有数字加在一起并输出给用户。因此,例如,如果用户输入4将是2 ^ 4 = 16. 1 + 6 = 7.但是这不适用于大整数,因为2 ^ 10000太大而无法存储所以我假设我必须使用一个数组。

我得到了这个概念,我只需要加倍2'x'次来得到答案,但我不知道如何将它存储在一个数组中以及如何处理当说8加倍时你会得到16 ,你需要长时间的乘法运载不是吗?

感谢收到的任何帮助。

总的来说,我的问题是:

  1. 如何阅读X的输入。我scanf("%s")并存储在数组中吗?
  2. 一旦存储,我如何进行加倍(因为基数将始终为2)

2 个答案:

答案 0 :(得分:0)

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

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

在C中,您不能使用这些,但不幸的是,这是GMP的作用。作为一组提示,这里有一些:

  • #include <stdint.h>如果您可以使用(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的概念进行比较。
  • 由于性能原因,我在这里使用的类型和尺寸可能不起作用/在实践中使用,但概念仍然存在。

答案 1 :(得分:0)

1。 阅读输入应该不是问题。如您所知,1&lt; = x&lt; = 10000,您可以照常阅读:scanf("%d", &x);

2。 由于您不允许使用bignum图书馆,为什么不自己制作?您可以在int s或char s的数组中逐位存储大量数字。从这样的事情开始:

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]);