题目描述
有一分数序列:2/1、3/2、5/3、8/5、13/8、21/13......。求出这个数列的前N项之和,保留两位小数。
输入描述
N
输出描述
数列前N项和
样例
输入:
输出:
16.48 第一次code: 使用递归:
import java.util.*; import java.math.BigDecimal; public class jisuanrong { public static double SimpleAdding(int num) { if(num==1 || num == 0) { return 1; } else { return SimpleAdding(num-1)+SimpleAdding(num-2); } } public static double aa(int num) { if(num == 1) { return 2; } else { return SimpleAdding(num+1)/SimpleAdding(num); } } public static double bb(int num) { if(num == 1) { return 2; } else { return aa(num)+bb(num-1); } } public static void main (String[] args) { // keep this function call here Scanner s = new Scanner(System.in); BigDecimal b = new BigDecimal(bb(s.nextInt())); double f1 = b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); System.out.println(f1); } }
时间效率非常低,当输入数为30时,耗费时间为62毫秒;输入35时,耗费时间为588毫秒;输入40时,耗费时间为5438毫秒。越往后,每增大1,耗费时间增长速率为70%。 ================================== 第二次code: 使用了循环:
import java.util.*; public class Main { public static void main (String[] args) { Scanner s = new Scanner(System.in); String str = String.format("%.2f",sum(s.nextInt())); System.out.println(str); } public static double sum(int num) { double i=2,k=1,n,s=0,m; for(n=1;n<=num;n++) { s+=i/k; m=i; i=i+k; k=m; } return s; } }
时间上耗费比递归要少的很多,但是计算到1474时,可以运算出结果,结果为2385.28,运算到1475时,结果为Infinity,运算到1476,结果是NAN.