C语言蓝桥杯刷题:数列求值

题目链接
在这里插入图片描述
解题思路:

我一开始的思路就是递归往下找,类似下面的函数,然后传参过去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;
}

在这里插入图片描述

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

劲夫学编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值