题目描述
有一分数序列:2/1、3/2、5/3、8/5、13/8、21/13......。求出这个数列的前N项之和,保留两位小数。
输入描述
N
输出描述
数列前N项和
样例
输入:
10
输出:
16.48 第一次code: 使用递归:
1 import java.util.*; 2 import java.math.BigDecimal; 3 4 public class jisuanrong 5 { 6 public static double SimpleAdding(int num) 7 { 8 if(num==1 || num == 0) 9 {10 return 1;11 }12 else13 {14 return SimpleAdding(num-1)+SimpleAdding(num-2);15 }16 } 17 public static double aa(int num)18 {19 if(num == 1)20 {21 return 2;22 }23 else24 {25 return SimpleAdding(num+1)/SimpleAdding(num);26 }27 }28 public static double bb(int num)29 {30 if(num == 1)31 {32 return 2;33 }34 else35 {36 return aa(num)+bb(num-1);37 }38 }39 public static void main (String[] args) 40 { 41 // keep this function call here 42 Scanner s = new Scanner(System.in);43 BigDecimal b = new BigDecimal(bb(s.nextInt())); 44 double f1 = b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); 45 System.out.println(f1); 46 } 47 }
时间效率非常低,当输入数为30时,耗费时间为62毫秒;输入35时,耗费时间为588毫秒;输入40时,耗费时间为5438毫秒。越往后,每增大1,耗费时间增长速率为70%。 ================================== 第二次code: 使用了循环:
1 import java.util.*; 2 3 public class Main 4 { 5 public static void main (String[] args) 6 { 7 Scanner s = new Scanner(System.in); 8 String str = String.format("%.2f",sum(s.nextInt())); 9 System.out.println(str); 10 } 11 public static double sum(int num)12 {13 double i=2,k=1,n,s=0,m;14 for(n=1;n<=num;n++)15 {16 s+=i/k;17 m=i;18 i=i+k;19 k=m;20 }21 return s;22 }23 }
时间上耗费比递归要少的很多,但是计算到1474时,可以运算出结果,结果为2385.28,运算到1475时,结果为Infinity,运算到1476,结果是NAN.
posted on 2016-08-23 23:24 阅读( ...) 评论( ...)