Професионална програма
Loading...
+ Нов въпрос
arjunah avatar arjunah 9 Точки

(Java - TechFund) Arrays, more exercises, задача Recursive Fibonacci

Здравейте, някой дали може да ми каже защо в Judge това решение има 85/100 (един тест дава Runtime Error):

import java.util.Scanner;

public class RecursiveFibonacci {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = Integer.parseInt(scanner.nextLine());
        long[] fibonacci = new long[n];
        for (int i = 0; i < n; i++) {
            if (i == 0 || i == 1) {
                fibonacci[i] = 1;
            } else {
                fibonacci[i] = fibonacci[i - 1] + fibonacci[i - 2];
            }
        }
        System.out.println(fibonacci[n - 1]);
    }
}

Докато това решение има 100/100:

import java.util.Scanner;

public class RecursiveFibonacci {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        int n = Integer.parseInt(scanner.nextLine());
        long first = 0;
        long second = 1;
        long third = second + first;
        for (int i = 0; i < n; i++) {
            first = second;
            second = third;
            third = first + second;
        }
        System.out.println(first);
    }
}
Благодаря предварително!

0
Fundamentals Module
KeepCoding avatar KeepCoding 555 Точки

При вход 0 или 1 програмата се опитва да достъпи несъществуващи индекси и гърми (fibonacci[i - 1], fibonacci[i - 2]). Когато имаш "Runtime Error" в judge, означава не че имаш грешен отговор, а че програмата е гръмнала. Явно предпоследният тест дава вход 0 или 1. За да даде първият код 100/100 ще трябва да добавиш това след четенето на входа:

        if (n <= 0) {
            System.out.println(0);
            return;
        }

        if (n == 1) {
            System.out.println(1);
            return;
        }

 

1
arjunah avatar arjunah 9 Точки

Благодаря много! Да, знам защо излиза Runtime Error, просто не предполагах, че ще е възможен вход "0", заради условието на самата задача:

"Constraints:

  • 1 ≤ N ≤ 50"

Всъщност, излиза 100/100 и без проверката за n== 1: при вход "1" се отпечатва "1" на конзолата и без тази проверка; Проблемът явно идва при вход "0", какъвто по условие не би трябвало да има, според мен.

Освен това в условието пише и "The first two elements are 1, 1.", което автоматично значи, че първият елемент от поредицата е "1", а не "0", и според мен не би трябвало въобще да се очаква да се отпечатва "0" (както става при вход "0") на конзолата щом първият елемент по условие е "1". Просто във втория вариант не съм обърнал внимание, че има случай, в който се отпечатва и "0" и затова е верен.

0
02/02/2019 21:40:44
mvacheva avatar mvacheva 42 Точки

Към условието на задачата имаш ограничение за входа  1 ≤ N ≤ 50. Което трябва да обработиш. Пробвай:

import java.util.Scanner;

public class RecursiveFibonacci {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = Integer.parseInt(scanner.nextLine());
        long[] fibonacci = new long[n];
        if(n>=1&&n<=50){
          for (int i = 0; i < n; i++) {
              if (i == 0 || i == 1) {
                  fibonacci[i] = 1;
              } else {
                  fibonacci[i] = fibonacci[i - 1] + fibonacci[i - 2];
              }
          }
          System.out.println(fibonacci[n - 1]);
        }else{
          System.out.println(n);
        }
        
    }
}

 

 

0
arjunah avatar arjunah 9 Точки

Благодаря!

Това предположих, че е ограничение за входа, който ще се подава в Judge; ако е ограничение за обработка в самата задача, тогава възниква въпросът защо и двата варианта горе минават 100/100 без проверка за вход > 50 :-)

Иначе, това според мен не трябва да е част от кода: 

}else{
          System.out.println(n);
        }

понеже тогава на конзолата ще се принтира число (реално това е входът), което не е част от поредицата на Фибоначи, което противоречи с условието на задачата.

0
mvacheva avatar mvacheva 42 Точки

Да. Замислих се, че не е редно да има вход над 50. Но май Judge винаги прави проверка с вход 0 

0
DukeV avatar DukeV 0 Точки

Ето и моя, за 0 е доста дразнещо наистина.

import java.util.Scanner;
public class cRecursiveFibonacci {
    public static void main(String[] args) {
        Scanner inputReader = new Scanner(System.in);
            double n = Double.parseDouble(inputReader.nextLine());

            if (n==1){
                System.out.println(1);
            }else if (n>1&&n<=50) {
                double a = 1;
                double b = 1;
                for (int i = 1; i <= n-1; i++) {
                    a = a + b;
                    double test = b;
                    b = a;
                    a = test;
               //     System.out.printf("%.0f\n",a);
                }
                System.out.printf("%.0f",a);
            }else if (n==0){
                System.out.println(0);
            }
    }
}
0
Bars1967 avatar Bars1967 8 Точки

Мдам.

Ако пък решиш на второто да изпълниш изцяло условието на задачата и ограничиш n  да е между 1 и 50  - тогава да видиш какви чудесии стават в Джъд-а...

Явно този, който е залагал проверката е прочел условието по диагонал.... малко.

0
krum_43 avatar krum_43 567 Точки

При тези ограничения за n не би трябвало да има проверка за n=0.Редицата на Фибоначи не е масив и членовете и започват с индекс 1.При това положение първият вариант ще гръмне само за n=1.

0