Другие языки программирования и технологии

Найти первое пятнадцатизначное число. С++

Даны числа фибоначи 1 1 2 3 5 8 13 21 ...Найти первое число Фибоначчи, которое содержит 15 цифр? Никак не можем решить уже. помогите плз. Вот формула фибоначи fib = fib[i-1]+fib[i-2];
Ну считаете по формуле числа. Как дойдете - будет вам ответ.
А так как числа большие, я бы разбивал их на меньшие - по несколько разрядов.
Владислав Сергеевич
Владислав Сергеевич
34 701
Лучший ответ
#include <stdio.h>
int main(){double a,b; for(a=b=1;a<=1e14;a=(b+=a)-a); printf("% 20.0lf",b); return 0;}

Если захочешь, чтобы программа печатала не только это число, но и все до него, убери ; перед printf.
#include <iostream>

int main() {
    long long a = 0, b = 1;
    while (a < 100000000000000LL) { // пока меньше, чем минимальное с 15 цифрами
        // вычисляется следующее число Фибоначчи
        b += a;
        a = b - a;
    }
    std::cout << a << std::endl;
}

> Redis
> writeln('1304969544928660');
Ну-ну. Содержит 16 цифр и такого числа Фибоначчи не существует.

> Krab Bark
> #include <stdio.h>
> int main(){double a,b; for(a=b=1;a<=1e14;a=(b+=a)-a); printf("% 20.0lf",b); return 0;}
Не смотря на оформление исходного кода, безусловно лучший ответ!
Роман Козлов
Роман Козлов
92 572
Формула конечно хороша, но не проще ли написать, что следующее число равно сумме дувух передыдущих. Так что возьмите 16-ти разрядный калькулятор и складывайте 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 26657, 46358, 73025....поверьте много времени это не займёт. Как вы видите числа увеличивается на порядок (разряд) в единицах 6 раз, в десятках 6 раз в сотнях 5 раз, в тысячах уже 4 разаВ десетках тыясч это 5 раз.. . т. е. на разрад примерно 5 вычислений.. . 14*5= 120 раз, из них 26 уже готовы. Понравилось? Нет. Тогда в Паскале.
с массивомКод Pascal
1
2
3
4
5
6
7
8
9
10
11var
a: array[1..10] of integer;
i: integer;
begin
a[1]:=0;
a[2]:=1;
for i:=3 to 10 do
a:=a[i-1]+a[i-2];
writeln('a(10) = ',a[10]);
readln;
end.
или без массива
Код Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14var
i,c,a,b: integer;
begin
a:=0;
b:=1;
for i:=3 to 10 do
begin
c:=a+b;
a:=b;
b:=c;
end;
writeln('10-е число Фибоначчи = ',c);
readln;
end.
Я вам дал как найти 10-е число, а вы ищите примерно 120-е и рядом. Удачи.
Блин. Номера и действия съехали.. . а жаль.
А нафига массив?
достаточно двух -и одно из них подменять новым сдвигая старое во второе через времянку.
15 значное -число знаков определяется по десятичному логарифму.

fibprev -одно, предидущее.
fib - текущее.

while(log(fib)+1<15){tmp=fib; fib+=fibprev;fibprev=tmp;}

примерно так
(не помню точно log() или ln() в стандартной библиотеке math.h - ну да по хелпам всегда можно глянуть и в случае чего домножить на переходный коэффициент)
-------
У Krab Bark ответ самый точный.
я протормозил и сходу не сообразил. что можно сравнивать не число цифр записи а просто со степенью десятки и не мучать комп логарифмами
program p;
begin
writeln('1304969544928660');
end.
Сергей Шевчук
Сергей Шевчук
6 852
int number=0;
while (number!=15)
{
fib=fib[i-1]+fib[i-2]; // тут вычисляешь следующее число
int len=Convert.ToString(fib); // конвертируешь в строку число фиб.
length=len.Length; // длина строки len
}
MessageBox.Show(number); // Это и будет первое 15 значное число.
Витя Ковалев
Витя Ковалев
1 686

Похожие вопросы