大数题,高精度累加。
分析一:用字符串操作,要达到2005位;估计第8000项的样子能达到;时间复杂度为O(8000*2000)--》》》O(10^8)
分析二:用int八位八位的存,所以二位数组的第二位只要开到255就够了;时间复杂度为0(8000*255)——》0(10^6)
我下面的代码用int64写的,为了更省时;
代码一:
#include<iostream>
#include<string>
using namespace std;
char ch[8000][2010];
int main()
{
int n;
while(scanf("%d", &n) != EOF)
{
memset(ch, '0', sizeof(ch));
ch[1][0] = '1';
ch[2][0] = '1';
ch[3][0] = '1';
ch[4][0] = '1';
int i, j, t, p = 0;
for(i = 5; i <= n; i++)
{
for(j = 0; j <= p; j++)
{
t = ch[i-1][j] + ch[i-2][j] + ch[i-3][j] + ch[i-4][j] - 4 * '0';
ch[i][j+1] += t / 10;
if(ch[i][j] + t % 10 >= 10 + '0')
{
ch[i][j+1]++;
ch[i][j] += t % 10 - 10;
}
else
ch[i][j] += t % 10;
}
if(ch[i][j] == '0')
p = j - 1;
else
p = j;
}
for(j = p; j >= 0; j--)
printf("%c", ch[n][j]);
printf("\n");
}
return 0;
}
代码二:#include<iostream>
#define M 8000
#define N 165
using namespace std;
__int64 ch[M][N];
void cal()
{
memset(ch, 0, sizeof(ch));
ch[1][1] = ch[2][1] = ch[3][1] = ch[4][1] = 1;
int i, j;
__int64 t;
for(i = 5; i < M; i++)
{
t = 0;
for(j = 1; j < N; j++)
{
t += ch[i-1][j] + ch[i-2][j] + ch[i-3][j] + ch[i-4][j];
ch[i][j] = t % 10000000000000000;
t /= 10000000000000000;
}
}
}
int main()
{
int n, i;
cal();
while(scanf("%d", &n) != EOF)
{
i = N-1;
while(ch[n][i] == 0)
i--;
printf("%I64d", ch[n][i--]);
while(i)
printf("%016I64d", ch[n][i--]);//%016Id表示不足16位的前面补0
printf("\n");
}
return 0;
}