问题:给定数列 1,1,1,3,5,9,17,····,从第4项开始,每项都是前三项的和。求第 20190324 项的最后4位数字。

数列求值

问题:给定数列 1,1,1,3,5,9,17,····,从第4项开始,每项都是前三项的和。求第 20190324 项的最后4位数字。

在这里插入图片描述


思路:

  1. 刚开始看这道题的时候我以为和斐波那契数列那样直接递归就完了,结果写出来报了个栈内存溢出异常,我查了一下,是递归太多次的问题,递归这条路走不通。
  2. 递归不行的话,我想着用个循环遍历试试吧,就写出了下面的代码1。这时我的想法是这样的:弄个while循环,弄个指针变量,然后弄个数一遍遍更改。最后判断一下倒数第四位是不是0。结果做出来和答案不一样,我把N=1 --> N=9试了一遍,发现没问题。想了很久不知道为什么,查了别人的答案才知道,第20190324项的数太长了,溢出了,要对数处理,所以我改了一下代码测试,发现可以。但是我的代码写的太多太丑了,我觉得问题很大。
  3. 我没想出来好的解答方案,看了别人的答案。最主要的就是把数变短,做法就是每一项都对10000区域,将每一项的大小都限制在10000以内,这道题输出的是后四位,所以没有影响。代码2是我更改后的答案,可以直接输出满足题目要求的数。思路还是窄啊。

代码1:

public class 数列求值 {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();

        int index = 1;
        int num1 = 0;
        int num2 = 0;
        int num3 = 0;
        int value = 0;
        while (index <= n) {
            if (index == 1 ) {
                num1 = 1;
                value = 1;
                index++;
                continue;
            } else if (index == 2) {
                num2 = 1;
                value = 2;
                index++;
                continue;
            } else if (index == 3) {
                num3 = 1;
                value = 3;
                index++;
                continue;
            }
            int m = num1 + num2 + num3;
            num1 = num2;
            num2 = num3;
            num3 = m;
            value = m;
            index++;
        }

        String s = Integer.toString(value);
        if (s.substring(s.length() - 4,s.length() - 3).equals("0")) {
            System.out.println(s.substring(s.length() - 3,s.length()));
        } else {
            System.out.println(s.substring(s.length() - 4,s.length()));
        }
    }

}

代码2:

public class 数列求值 {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();

        int a = 1, b = 1, c = 1;  //定义三个辅助变量,表示第一、第二、第三个数
        int val = 0;    //最后的值
        if (n == 1 || n == 2 || n == 3) {   //n=1,2,3时项的值为1
            val = 1;
        }
        for (int i = 4; i <= n; i++) {
            val = (a + b + c) % 10000;  //每个项的值都对10000取余,限制项的大小低于10000
            a = b;
            b = c;
            c = val;
        }
        if (val / 1000 == 0) {  //判断千位是否为0
            System.out.println(val % 1000);
        } else {
            System.out.println(val);
        }
    }
}
  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值