题目链接
解题思路:
我一开始的思路就是递归往下找,类似下面的函数,然后传参过去n=20190324,但是这里就会出现递归的经典错误:递归次数太多,栈爆了。因为你n非常大,而递归又是一层一层往下找,每层是*3,n层之后就是3^n,栈就爆了。。。
int func(int n)//返回数列第n项
{
if(n==3||n==2||n==1)
{
return 1
}
else
{
return func(n-1)+func(n-2)+func(n-3);//返回前三项和
}
}
然后是我的第二个思路,迭代往上找,但是直接迭代也有问题,
第20190324个数过于庞大 无论int 、 long、BigDecimal等都无法、承载这么大的数
题目要求我们只取最后四位 ,
我们可以对每次运算出来的结果 %10000 这样每次结果就都保留最后四位数字
举个例子:
2209+4063+7473=13745,13745后四位3745
4063+7473+13745=25281,25281后四位5281
4063+7473+3745=15281.15281后四位5281(和上面结果一样)
最后是我运行成功的代码:
#include <stdio.h>
#include <stdlib.h>
int func(int n)//返回数列第n项
{
int arr[n+1];//最大下标为n
arr[1]=1;
arr[2]=1;
arr[3]=1;
int i=4;
for(i=4;i<=n;i++)
{
arr[i]=(arr[i-1]+arr[i-2]+arr[i-3])%10000;
//第20190324个数过于庞大 无论是递归还是迭代都会出错, 而且int 、 long、BigDecimal等都无法、承载这么大的数
//题目要求我们只取最后四位 , 那我们可以对每次运算出来的结果 %10000 这样每次结果就都保留最后四位数字
//举个例子:
//2209+4063+7473=13745,13745后四位3745
//4063+7473+13745=25281,25281后四位5281
//4063+7473+3745=15281.15281后四位5281(和上面结果一样)
}
return arr[n];
}
int main(int argc, char *argv[])
{
int x=func(20190324);
printf("%d",x);
return 0;
}