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

来源:互联网 发布:kitti数据集如何使用 编辑:程序博客网 时间:2024/04/29 09:17


斐波那契数列四吧

时间限制: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();
 }
}

0 0