您的位置:首页 > 编程语言 > Java开发

java算法-斐波那契数列四吧(公式递推,不定方程求解)

2017-02-06 17:51 176 查看
斐波那契数列四吧

时间限制:3000 ms  |  内存限制:65535 KB

难度:2

描述

斐波那契数列为:0,1,1,2,3,5,8,13....,常规递推公式为f(n)=f(n-1)+f(n-

2);

但这里不一样的是,我们的前两个数字不一定是0,1;

也就是说,斐波那契数列的前两个数字是随机数(保证是非负整数)。下面我们

开始吧,我会告诉你斐波那契数列的第20项的值m,请你判断是否会有这样的数列

存在。

对了,你要保证数列的每一项都是整数哦

输入第一行呢,按照惯例我们输入一个数字N,表示测试数据组数。

 接下来肯定就有N行了。。

 每行包含一个整数m(m<10000000),表示数列的第20项的值。输出如果存在这

样的数列呢,输出该数列的第一项和第二项的值

else 输出“No answer”

每组数据输出后换行。

样例输入1

1000000

样例输出154 144

/*

 * 斐波那契数列四吧

 * 思路:有题意知

 * f(3)=f(1)+f(2)

 * f(4)=f(1)+2f(2)

 * f(5)=2 3

 * f(6)=3 5

 * .....

 * 这里可以写个递推推程序求出f(20)公式

 */

public class Main {

 public static void main(String[] args) {

  int a = 1, b = 1, temp;

  for (int i = 3; i <= 20; i++) {

   System.out.println(i + "=" + a + " " + b);

   temp = b;

   b = a + b;

   a = temp;

  }

 }

}

运行结果:

3=1 1

4=1 2

5=2 3

6=3 5

7=5 8

8=8 13

9=13 21

10=21 34

11=34 55

12=55 89

13=89 144

14=144 233

15=233 377

16=377 610

17=610 987

18=987 1597

19=1597 2584

20=2584 4181

/*

 * 这里可以看到f(20)=2584*f(1)+4181*f(2)

 * 做到这里大家明白此题了吧,就是不定方程求解问题

 * 把上边的公式变换得

 * f(2)=(f(20)-2584f(1))/4181

 * 然后判断f(2)是否是整数

 * 程序如下:

 */

import java.util.Scanner;

public class Main {

 public static void main(String[] args) {

  Scanner sc = new Scanner(System.in);

  int n = sc.nextInt();

  int f1, f2, f20, temp;

  while (n-- > 0) {

   f20 = sc.nextInt();

   f1 = 0;

   while (true) {

    temp = f20 - 2584 * f1;

    // f1过大跳出循环没有答案

    if (temp < 0) {

     System.out.println("No

answer");

     break;

    } else {// 判断f2是否为整数

     if (temp % 4181 == 0) {

      f2 = temp / 4181;

      System.out.println(f1

+ " " + f2);

      break;

     }

    }

    f1++;

   }

  }

  sc.close();

 }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: