计算2 ^ n的高精度程序

Ice*_*lla 5 c algorithm bignum

我正在用C语言构建一个可以获得权限的程序2.用户输入值n,程序计算2^n.

这是代码.

输入时出现问题 100

我得到了什么:

1,267,650,600,228,229,400,000,000,000,000
Run Code Online (Sandbox Code Playgroud)

我应该得到什么

1,267,650,600,228,229,401,496,703,205,376
Run Code Online (Sandbox Code Playgroud)

它必须完全用ANSI C编码.关于如何提高精度的任何想法?最大值N必须是256(256位,我想,这意味着最大输出应该是2^256).

我在这里缺少的是精确度,我不知道如何解决这个问题.有任何想法吗?

Bri*_*n L 2

这是我对哈马尔方法的快速而肮脏的实现。,将十进制数存储为 C 字符串,并以相反的顺序排列数字。

在ideone上运行代码

void doubleDecimal(char * decimal)
{
    char buffer[256] = "";
    char c;
    unsigned char d, carry = 0;
    int i = 0;

    while (c = decimal[i])
    {
        d = 2 * (c - '0') + carry;
        buffer[i] = (d % 10) + '0';
        carry = d / 10;
        i++;
    }

    if (carry > 0)
        buffer[i++] = (carry % 10) + '0';

    buffer[i] = '\0';
    strncpy(decimal, buffer, 256);
}

void reverse(char * str)
{
    int i = 0;
    int j = strlen(str) - 1;

    while (j > i)
    {
        char tmp = str[i];
        str[i] = str[j];
        str[j] = tmp;

        i++;
        j--;
    }
}

int main(void)
{
    char decimal[256] = "1";
    int i;

    for (i = 0; i < 100; i++)
        doubleDecimal(decimal);

    reverse(decimal);
    printf("%s", decimal);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

1267650600228229401496703205376
Run Code Online (Sandbox Code Playgroud)