XDU1139

import java.util.Scanner;
public class Main{
    public static void main(String args[]){
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()){
            int n=sc.nextInt();
            int i=1,sum=1;
            while (n>=sum){
                i++;
                sum=sum+fib(i);
            }
            if(n-sum+fib(i)>fib(i-1))    System.out.println(i+" "+(n-sum+fib(i)));
            else  System.out.println((i-1)+" "+fib(i-1));
        }
    }

    static int fib(int i){
        if(i==1||i==2)  return 1;
        else  return fib(i-1)+fib(i-2);
    }
}
当OJ判断时,时间超限,关于Fibonacci数列,《编程之美》对它惊醒了各种分析,由于调用方法每次都要从头求解fib(i)的值,故时间复杂度较高;

解决策略1:利用空间弥补时间

        利用数组记录已算Fibonacci数列项

解决策略2:递推

import java.util.Scanner;
public class Main {
    public static void main(String args[]) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            long n = sc.nextLong();
            int i = 2, sum = 2;
            int x = 0, y = 1, z = 1;
            if (n == 1 || n == 2) System.out.println(1 + " " + 1);
            while (n >= sum && n > 2) {
                i++;
                x = y;
                y = z;
                z = x + y;
                sum = sum + z;
            }
            if (n>2){
                if (n - sum + z > y) System.out.print(i + " " + (n - sum + z));
                else System.out.print((i - 1) + " " + y);
            }
        }
    }
}     比起递归,时间复杂度明显减小,但OJ还是时间超限


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值