有人可以解释如何让像3 ^ 9999这样的操作在c ++中工作,正如我发现的那样,如果数字太长会导致问题。我听说有办法解决这个问题。 (请不要建议任何外部库)
答案 0 :(得分:2)
将您的问题分成三个问题。
1)首先制定解决方案如何乘以很长的整数。
2)将9999
转换为二进制10011100001111
。有14位。设置8位。设置位(按结束顺序)表示9999 = 1 + 2 + 4 + 8 + 256 + 512 + 1024 + 8192
。这些因素在3^2 = 3^1 * 3^1
等n^(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");
}