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 554 Точки

При вход 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 9 Точки

Мдам.

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

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

0
krum_43 avatar krum_43 756 Точки

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

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.