-3
votes

Produit de deux numéros de Fibonacci consécutifs - Code Times Out

J'essaie de résoudre le produit de nombres de fibres consécutifs sur des créatures à Java. Les tests d'échantillons fonctionnent bien, mais quand je clique sur tentative, il est temps de sortir.

Qu'est-ce qui pourrait être mon erreur?

Vous pouvez trouver les détails de la tâche ici: https://www.codewars.com/kata/product-of-consecutive-fib-numbers xxx


6 commentaires

"Les exemples de tests fonctionnent bien" - veuillez le montrer dans votre code. "Quand je clique sur tentative" - ​​aucune idée de ce que cela signifie


Connaissez-vous les utilisations des fichiers-apports de test?


Il gère mon code contre la suite de tests complète, donc fondamentalement 2 tests fonctionnent avec succès, les autres TIMED OUT


@ Dávidkatona Que se passe-t-il lorsque vous utilisez ceci: ideone.com/rqvecr , c'est une version minifiée faite par moi de votre approcher


Public Void Test1 () {LONG [] R = NOUVEAU LONG [] {55, 89, 1}; ASSERTARRAYEQUAIRE (R, PRODFIB.PRODUCTFIB (4895));


@Lino l'a essayé. mêmes résultats. Les échantillons de tests fonctionnent bien et des tests complets. Mais merci!


3 Réponses :


-1
votes

Essayez ceci xxx

}


3 commentaires

Vous exécutez une fonction récursive six fois dans chaque itération. L'efficacité de cet algorithme est horrible , ésiissante lorsque les chiffres restent les mêmes pour chaque itération.


@Lino Oui, je ne comptais même pas les appels à l'intérieur de la fonction elle-même.


@Realskeptic Oh, j'ai manqué ceux dans le corps alors que c'est probablement au moins 12 appels ... pas tout à fait la manière la plus performante



0
votes

Votre problème est que vous définissez vos variables comme int code> au lieu de long code>.

Si vous essayez d'exécuter votre programme avec le produit 44361286907595736L Code > Ça va aller dans une boucle sans fin. La raison en est que lorsque vous multipliez deux int code> s, le résultat est également un int code>. Ce produit est le résultat de MultiPlying 165580141 et 267914296. Ce sont des INT légitimes, mais lorsque vous les multipliez, le nombre est trop gros pour un débordement Int-Integer. Donc, vous obtenez un numéro qui est beaucoup plus bas que 44361286907595736l code>. Et votre boucle ne s'arrête pas. P>

Si vous définissez vos variables comme long code>, cela ne se produira pas. Voici une version légèrement plus lisible de votre programme. P>

public static long[] productFib(long prod) {

    long prev = 0;
    long curr = 1;
    long multiplied = prev * curr;

    while (multiplied < prod) {
        long temp = curr;
        curr += prev;
        prev = temp;
        multiplied = prev * curr;
    }

    return new long[] { prev, curr, multiplied == prod ? 1 : 0 };

}


0 commentaires

0
votes

Définition du problème: Entrée: Produit - Le produit recherché Sortie: Array de 3 éléments: {F1, F2, résultat}

où F1 est le premier numéro de Fibonacci, F2 est le deuxième numéro de fibonacci, résultat est égal à 1 si F1 * F2 = produit, Sinon: résultat = 0 p>

Ce problème peut être résolu plus efficacement en utilisant les formules suivantes: 1. Formule directe pour obtenir le numéro de N'th Fibonacci. 2. Formule directe pour obtenir l'index d'un numéro de Fibonacci donné. P>

Vous pouvez obtenir les formules et explications pertinentes dans le lien suivant: https://fr.wikipedia.org/wiki/fibonacci_number p>

L'idée est d'obtenir l'index du numéro Fibonacci: SQRT (produit) P>

Ensuite, nous pouvons accéder aux numéros de Fibonacci suivants et précédents et comparer leurs produits contre le produit donné P>

Il s'agit du code Java correspondant: P>

private static double phi = (1 + Math.sqrt(5)) / 2;

public static void main(String[] args) { 
  System.out.println(Arrays.toString(fibProd(800))); // [34, 55, 0]
  System.out.println(Arrays.toString(fibProd(714))); // [21, 34, 1]
  System.out.println(Arrays.toString(fibProd(15))); // [3, 5, 1]
  System.out.println(Arrays.toString(fibProd(40))); // [5, 8, 1]
  System.out.println(Arrays.toString(fibProd(2))); // [1, 2, 1]
  System.out.println(Arrays.toString(fibProd(3))); // [2, 3, 0]
}

private static long[] fibProd(long product) {
    long currentIndex = getFibIndex(Math.round(Math.sqrt(product)));
    long currentElement = getFibElement(currentIndex);
    long previousElement = getFibElement(currentIndex - 1);
    long nextElement = getFibElement(currentIndex + 1);

    int c1 = Long.compare(previousElement * currentElement, product);

    if(c1 == 0) {
        return new long[] {previousElement, currentElement, 1};
    }

    int c2 = Long.compare(currentElement * nextElement, product);

    if(c2 == 0) {
        return new long[] {currentElement, nextElement, 1};
    }

    if (c1 < c2) {
        return new long[] {currentElement, nextElement, 0};
    } else {
        return new long[] {previousElement, currentElement, 0};
    }
}

private static long getFibIndex(long item) 
{ 
    double m = item * Math.sqrt(5) + 0.5;
    return Math.round(Math.log(m) / Math.log(phi));
}

private static long getFibElement(long index) {
    return Math.round(Math.pow(phi, index)  / Math.sqrt(5)); 
}


0 commentaires