2015-10-04 2 views
1

У меня есть два алгоритма для печати первого числа фибоначчи с 1000 цифрами, но, похоже, я что-то упускаю.Найти индекс числа фибоначчи с 1000 цифрами (PE # 25)

Algo 1

public class ab{ 
public static void main(String[] args){ 
    float phi = (float) 1.618033989; 
    float curr = 1; 
    float noOfDigits = 0; 
    float ans; 
    float fiveSqrt = (float) Math.sqrt(5); 
    while(noOfDigits< 1001){ 
     noOfDigits = (curr*Math.log10(phi)) - Math.log10(fiveSqrt); 
     System.out.println("curr : " + curr + "Digits : " + Math.round(noOfDigits)); 
    curr++; 
    } 
} 
} 

Output

Его выход его довольно долго, но в конце концов он читает:

curr : 4781.0Digits : 999 
curr : 4782.0Digits : 999 
curr : 4783.0Digits : 999 
curr : 4784.0Digits : 999 
curr : 4785.0Digits : 1000 
curr : 4786.0Digits : 1000 
curr : 4787.0Digits : 1000 
curr : 4788.0Digits : 1000 
curr : 4789.0Digits : 1000 
curr : 4790.0Digits : 1001 

Кажется, 4785 ответ, но оснастки! его неправильным. Поэтому я попытался более математический подход, решая уравнение Вольфрама в обратном порядке.

ans = (1000 + (float) Math.log10(fiveSqrt))/ (float) Math.log10(phi); 
System.out.println(ans); 

Выход: 4786.6445 Опять же. Я что-то пропустил?

+0

Ermm ... возможно, хотите значение >><< наименьшего числа Фибоначчи с 1000 цифр ... –

+1

Нужна ли число Фибоначчи или порядковый номер этого числа? – laune

+0

Почему вы считаете, что это уравнение даст вам число фибоначчи с определенным количеством цифр? Я помню вычисления числа фибоначчи рекурсивно - не с помощью простого простого уравнения, такого как # нужных цифр, добавленных к константе. Я не вижу, как это может работать, но это не математический сайт. Вы можете попробовать http://math.stackexchange.com. –

ответ

3

Прочитайте this учебник, чтобы получить полное понимание. Вы неправильно алгоритм, вы использовали Math.round(noOfDigits), который является неправильным, что вы должны делать:

  1. Вычислить noOfDigits, как вы делаете в алгоритме
  2. Extract целую часть.
  3. Добавить '1' к нему.

    long roundedNumber; 
    while(noOfDigits< 1001){ 
    noOfDigits = (curr*Math.log10(phi)) - Math.log10(fiveSqrt); 
    roundedNumber = (long)noOfDigits + 1; 
    System.out.println("curr : " + curr + "Digits : " + Math.round(roundedNumber)); 
    curr++; 
    } 
    

    Который дает мне ответ: 4782.0 Что является правильным.

Смежные вопросы