首先 , InputStreamReader.read() 只能读取一个字符 , 要读取一个整数,可以使用java.util.Scanner.
- import java.io.InputStreamReader;
- import java.util.Scanner;
- public class Test4 {
- public static void main(String[] args) throws Exception {
- System.out.print("please input n:");
- InputStreamReader bur = new InputStreamReader(System.in);
- Scanner scanner=new Scanner(bur);
- int n = scanner.nextInt();
- int num = fun(n);
- System.out.print("answer is " + num);
- }
- public static int fun(int n) {
- if (n == 1 || n == 2)
- return 1;
- else
- return fun(n - 1) + fun(n - 2);
- }
- }
复制代码
然后,这种斐波那契数列的算法,只是定义算法,只能用来计算斐波那契数列的前面几项,其运行时间是成指数型增长的,当n=50时就要算半天了,另外斐波那契数列的数值增长速度是非常快的,用int来存储数值太小了.下面提供了一种解决方案:
- import java.math.BigInteger;
- import java.util.ArrayList;
- import java.util.List;
- public class Test4 {
- private static List<BigInteger> results;//将中间结果存储起来
- static {
- //初始化 results
- results = new ArrayList<>();
- results.add(new BigInteger("0"));
- results.add(new BigInteger("1"));
- }
- public static void main(String[] args) throws Exception {
- for (int i =1000 ; i<2000 ;++i)
- System.out.println(fun(i));
- }
- public static BigInteger fun(int n) {
- //如果所求的数在results中直接返回
- if (n < results.size())
- return results.get(n);
- else {
- for (int i = results.size(); i < n + 1; ++i)
- results.add(results.get(i - 1).add(results.get(i - 2)));
- return results.get(n);
- }
- }
- }
复制代码
计算一千,一万,一亿都是秒杀啊 ,当然用 斐波那契数列的数学公式更快哈(请找百度) |