标签:
题目描述
有一分数序列: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 else 13 { 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 else 24 { 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 else 35 { 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.
标签:
原文地址:http://www.cnblogs.com/enginehome/p/5798230.html