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? P>
Vous pouvez trouver les détails de la tâche ici: https://www.codewars.com/kata/product-of-consecutive-fib-numbers p>
3 Réponses :
Essayez ceci } p> p>
Vous exécutez une fonction récursive six fois dans chaque itération. L'efficacité de cet algorithme est horrible i>, é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
Votre problème est que vous définissez vos variables comme Si vous essayez d'exécuter votre programme avec le produit Si vous définissez vos variables comme int code> au lieu de
long code>.
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>
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 };
}
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)); }
"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!