java - 一道简答的算法
天蓬老师
天蓬老师 2017-04-17 13:08:09
[Java讨论组]

  1. 列表项目
     public static void main(String[] args) {
         Scanner in=new Scanner(System.in);
         while(in.hasNext()){
            int A=in.nextInt();
            int B=in.nextInt();
            int n=in.nextInt();
            if(A>=1 && A<=1000 && B>=1 && B<=1000 && n>=1 && n<=100000000){
            if(A==0 && B==0 && n==0){
                break;
            }
            int a[]=new int[n];
            if(n==1){
                a[0]=1;
            }
            if(n==2){
                a[0]=1;
                a[1]=1;
            }
            if(n>2){
                a[0]=1;
                a[1]=1;
            for(int i=2;i<n;i++){
                a[i]=(A * a[i-1] + B * a[i-2])%7;
            }
            }
            System.out.println(a[n-1]);
         }
        }

    }

我这样写,显示错误。
不知道哪里错了。

我这样写对的,不知道上一种方法哪里错了

天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

全部回复(2)
阿神

报啥错你看了么?显示错误这样的问题描述,如果是问你自己,你该如何回答?

推测是OOM了 ,算法没啥问题,但是如果n=100000000,就要分将近400M内存给new int[n];
一般的ACM平台,不会给这么大内存吧

黄舟

这题就是斐波那契的变种,三种方法可以得出结果,第一种是传统的递归模式(效率极低,请勿使用),第二种是尾递归,第三种是单次循环,都可以使用。

javaimport java.util.Scanner;

public class Main {
    private int A,B;
    Main(int A,int B){
        this.A=A;
        this.B=B;
    }
    // 递归,效率极低
    public int answer(int n){
        if(n==1 || n==2)return 1;
        return (A*answer(n-1)+B*answer(n-2))%7;

    }
    // 尾递归,效率高
    public int answer2(int n){
        return answer2(n,1,1);
    }
    public int answer2(int n,int x,int y) {
        if(n==1 || n==2)return y;
        return answer2(n-1,y,(A*y+B*x)%7);

    }
    // 单次循环,效率高
    public int answer3(int n){
        if(n==1 || n==2)return 1;
        int x=1,y=1;
        for(int i=3;i<=n;i++){
            int z=y;
            y=(A*y+B*x)%7;
            x=z;
        }
        return y;
    }

    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        while(in.hasNext()){
            int A=in.nextInt(),B=in.nextInt(),n=in.nextInt();
            if(A==0 && B==0 && n==0){
                break;
            }
            if(A>=1 && A<=1000 && B>=1 && B<=1000 && n>=1 && n<=100000000){
                System.out.println(new Main(A,B).answer3(n));
            }
        }
    }
}
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号