找到Fibonacci系列中小于或等于该数字的所有数字的总和

时间:2017-06-08 06:10:15

标签: java numbers sum fibonacci

Fibonacci数是以下整数序列中的数字。

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144 . . .

鉴于本系列Fn中的特定数字,您的程序需要找到Fibonacci系列中小于或等于该数字的所有数字的总和。

输入格式 您的课程将在STDIN的Fibonacci系列中提供一个编号。

约束

0<<Fn<100000

示例输入

8

示例输出

The output for above input (8) should be 0 + 1 + 1 + 2 + 3 + 5 + 8
20

为了解决上述问题,我编写了一个像

这样的代码
import java.util.*;
import java.lang.*;
import java.io.*;

class MyTest{
    public static Integer solveProblem(int n) {
        if (n>=0 || n<100000) {
        int fibo[] = new int[n+1];
        fibo[0] = 0; fibo[1] = 1;
        int sum = fibo[0] + fibo[1];
        for (int i=2; i<=n; i++) {
            fibo[i] = fibo[i-1]+fibo[i-2];
            if(n >= fibo[i]) {
                sum += fibo[i];
            } else {
                break;
            }
        }
        return sum;
        } else {
            return 0;    
        }
    }

    public static void main (String[] args) throws java.lang.Exception {
        Scanner in = new Scanner(System.in);
        int sum = MyTest.solveProblem(in.nextInt());
        System.out.println("This is the output:"+sum);
    }
}

我运行该程序,它与上面提到的示例测试用例一样正常但是当我在在线测试测验中提交这个程序时,它会运行他们的测试用例,它将失败。

我的程序有问题或者我没有正确理解这个问题。请帮我找出这个问题的确切答案。

3 个答案:

答案 0 :(得分:3)

您的代码似乎因n = 0和n = 1而失败。

  • 对于n = 1,您返回1但应返回2(因为有两个元素的值为1,您应该将它们都添加到总和中。)
  • 对于n = 0,您将抛出异常。

您可以通过为这些案例添加特殊检查来解决此问题:

public static Integer solveProblem(int n) {
    if (n==0) 
        return 0;
    else if (n==1) 
        return 2;
    else if (n>=0 || n<100000) {
        int fibo[] = new int[n+1];
        fibo[0] = 0; fibo[1] = 1;
        int sum = fibo[0] + fibo[1];
        for (int i=2; i<=n; i++) {
            fibo[i] = fibo[i-1]+fibo[i-2];
            if(n >= fibo[i]) {
                sum += fibo[i];
            } else {
                break;
            }
        }
        return sum;
    } else {
        return 0;    
    }
}

答案 1 :(得分:1)

您应该从扫描仪中获取值

Scanner in = new Scanner(System.in);
int sum = MyTest.solveProblem(8);

使用Scanner.nextInt()

Scanner in = new Scanner(System.in);
int sum = MyTest.solveProblem(in.nextInt());

如果您输入的值为0,则您的条件会接受它,但您创建了一个大小为1的数组,然后尝试访问第二个值 - &gt; ArrayIndexOutOfBoundsException

int fibo[] = new int[n+1];
fibo[0] = 0; 
fibo[1] = 1; //HERE, exception as there is not `fibo[1]`

将条件更新为

if ( n > 0 && n < 100000) //note the && to correct your logic error too

注意:我不认为在这里使用数组是一个好主意,因为你使用的是一个不必要的大数组(没有完全使用),使用两个变量(last,current)会更简单

答案 2 :(得分:0)

import java.util.*;
import java.lang.*;
import java.io.*;

class CutShort
{
    public static long solveProblem(int input) {        

        long sum = 0;        

        long finalstate = 1;
        long currentstate = 0;

        while(finalstate<=input) {

            sum = sum+finalstate;

            long add = currentstate + finalstate;

            currentstate = finalstate;

            finalstate = add;
        }
        return sum;

    }


public static void main (String[] args) throws java.lang.Exception

    {

        Scanner in = new Scanner(System.in);

        /*Parse input here*/

        System.out.println("Enter you Input");

        int input = in.nextInt();

        long output = 0;

        if(input>0 && input<100000)

        output = solveProblem(input);

        System.out.println("This is the output" + output);

    }

}