如何在c ++中计算和打印3 ^ 9999?

时间:2012-09-05 18:14:17

标签: c++ numbers exponential

有人可以解释如何让像3 ^ 9999这样的操作在c ++中工作,正如我发现的那样,如果数字太长会导致问题。我听说有办法解决这个问题。 (请不要建议任何外部库)

4 个答案:

答案 0 :(得分:2)

将您的问题分成三个问题。

1)首先制定解决方案如何乘以很长的整数。

2)将9999转换为二进制10011100001111。有14位。设置8位。设置位(按结束顺序)表示9999 = 1 + 2 + 4 + 8 + 256 + 512 + 1024 + 8192。这些因素在3^2 = 3^1 * 3^1n^(2^m) = n^(2^(m-1)) * n^(2^(m-1))之后很有用。您可以从3^1 = 3开始计算周期中的因子,即13次乘法。

3)通过将因子乘以结果来计算3^9999 = 3^1 * 3^2 * 3^4 * 3^8 * 3^256 * 3^512 * 3^1024 * 3^8192。这又增加了7次。

要计算3 ^ 9999,您需要20个非常长的整数乘法。

答案 1 :(得分:1)

由于您要求的解决方案不依赖于库,因此您必须采取艰难的方式。

创建一个将两个数字数组相乘的函数。你需要大约log10(3)*9999个数字,或4771.用全0和3初始化两个数组,然后将第一个乘以第二个9998次。

答案 2 :(得分:1)

希望你不是在寻找优化......

int N = 9998;
int M = 5000;
int arr [M];

for ( int j = 0 ; j < M ; ++j )
        arr[j]=0;

arr[M-1] = 3;


for ( int i = 0 ; i < N ; ++i ) {

        for ( int j = 0 ; j < M ; ++j )
                arr[j] = arr[j]*3;

        for ( int j = M-1 ; j > 0 ; --j ) {
                arr[j-1] = arr[j-1] + arr[j]/10;
                arr[j] = arr[j]% 10;
        }
}


for ( int j = 0 ; j < M ; ++j )
        std::cout << arr[j];

答案 3 :(得分:0)

关于如何让它变得更丑陋的任何想法让他的教授不接受它? =]

#include <stdio.h>
#include <string.h>
int main()
{
    unsigned char ds[9999];
    unsigned char c;
    ds[0] = 3;
    bzero(ds+1, 9998);
    for(int p = 2; p <= 9999; p++)
    {
        c = 0;
        for(int d=0; d<p/2+1; d++)
        {
            ds[d] = ds[d] * 3 + c;
            c = ds[d] / 10;
            ds[d] = ds[d] % 10;
        }
    }
    int d = 9998;
    for(; d>=0; d--)
        if(ds[d] != 0)
            break;
    for(; d>=0; d--)
        printf("%d", ds[d]);
    printf("\n");
}