码农谷 求前N项之和

题目描述

有一分数序列: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.

时间: 2025-01-07 04:39:51

码农谷 求前N项之和的相关文章

Java50道经典习题-程序20 求前20项之和

题目:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和.分析:请抓住分子与分母的变化规律.三个连续分数之间的规律是:上两个分子之和等于第三个分数的分子,上两个分母之和等于第三个分数的分母 1 public class Prog20{ 2 public static void main(String[] args){ 3 double n1 = 1; 4 double n2 = 1; 5 double fraction = n1/n2; 6 dou

求数列前20项之和

有一个分数序列:2/1,3/2,5/3,8/5,13/8,21/13..求出这个数列前20项之和.function text4(){ var denominator; var molecule; var i= 0,k= 1,str=""; var str1="",str2="",sum=0; for(var j=1;j<=20;j++){ //分母 denominator=i+k; i=k; k=denominator; str+=deno

c语言;求Sn=a+aa+aaa+aaaa+aaaaa的前5项之和 其中a是一个数字 例如:2+22+222+2222+22222

程序: //求Sn = a + aa + aaa + aaaa + aaaaa的前5项之和,其中a是一个数字,例如:2 + 22 + 222 + 2222 + 22222 #include<stdio.h> int main() { int i = 0; int a = 0; int sum = 0; int num=0; scanf("%d",&num); for (i = 0; i < 5; i++) { a = a * 10 + num; sum = s

16.有一分数序列 1/2,2/3,3/5,5/8,8/13,13/21,…求出这个序列的前200 项之和

使用向量: #include<iostream>#include<vector>using namespace std;int FenShu(int); int main(){    double sum=0,sum1=0;    for(int i=2;i<=200;i++)    {        sum1+=FenShu(i);    }    sum=sum1+0.5;    cout<<sum<<endl;    return 0;} int

有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。

/** * @author 有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和. */ public class Sum { public static void main(String[] args) { double a = 1, b = 1, c = 0, s = 0; for (int i = 0; i < 20; i++) { c = a + b; s = s + c / a; b = a; a = c; } System.out.pri

求分数序列的前n项之和

有一个分数序列 2/1,3/2,5/3,8/5,13/8,21/13,.... 求这个分数序列的前n项之和. 输入 测试数据有多组,其第一行为一个正整数k(0<k<=90),表示测试数据的组数.每组测试数据为一行,为单个正整数n(0<n<=90). 样例输入 1 2 输出 每组测试数据单独输出有一行:分数序列的和(精确到小数点后4位). 样例输出 3.5000 时间限制C/C++语言:1000MS其它语言:3000MS 内存限制C/C++语言:65536KB其它语言:589824K

求2/1+3/2+5/3+8/5+13/8...前20项之和

package com.exercise.coreJava; /** *求2/1+3/2+5/3+8/5+13/8...前20项之和 */ public class Sum { public static void main(String[] args) { double sum = 0; double fenZi = 2.0, fenMu = 1.0; for (int i = 1; i <= 20; i++) { sum += fenZi / fenMu; fenMu = fenZi; fe

7-49 求前n项的阶乘之和 (15 分)

从键盘输入一个整数n,求前n项的阶乘之和,1+2!+3!+...+n!的和 输入格式: 输入一个大于1的整数.例如:输入20. 输出格式: 输出一个整数.例如:2561327494111820313. 输入样例: 在这里给出一组输入.例如: 20 输出样例: 在这里给出相应的输出.例如: 2561327494111820313 def f(n): ans = 1 for i in range(1,n+1): ans *= i return ans n = int(input()) sum = 0

2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。

package com.hanqi; public class Qiuhe { public static void main(String[] args) { // TODO 自动生成的方法存根 double sum=0,fenshu=0,a=1,b=2,c=0; for (int i = 0; i < 20; i++) { fenshu=b/a; c=a; a=b; b=a+c; sum+=fenshu; //System.out.println(fenshu); } System.out.