С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/88: Рейтинг темы: голосов - 88, средняя оценка - 4.69
9 / 4 / 0
Регистрация: 12.05.2015
Сообщений: 48
1

Последняя цифра большого числа Фибоначчи

27.11.2015, 01:51. Показов 16725. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите разобраться. Вроде все правильно и ответ правильный, но процесс решения не правильный. Не могу понять, что не так. Уже третий день голову ломаю...
Прохожу курс и там задача. Хочется уже просто понять где косяк.

Дано число 1≤n≤10^7, необходимо найти последнюю цифру n-го числа Фибоначчи.
Как мы помним, числа Фибоначчи растут очень быстро, поэтому при их вычислении нужно быть аккуратным с переполнением. В данной задаче, впрочем, этой проблемы можно избежать, поскольку нас интересует только последняя цифра числа Фибоначчи: если 0≤a,b≤9 — последние цифры чисел Fi и Fi+1 соответственно, то (a+b)mod10 — последняя цифра числа Fi+2.

Sample Input: 560233
Sample Output: 3
Мое решение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <cassert>
#include <iostream>
 
class Fibonacci {
 public:
  static int get_last_digit(int n) {
    assert(n >= 1);
    if (n == 0 || n == 1) {
          return n;
      }
      return ((n - 1) + (n - 2))%10;
    return n;
  }
};
 
int main(void) {
  int n;
  std::cin >> n;
  std::cout << Fibonacci::get_last_digit(n) << std::endl;
  return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.11.2015, 01:51
Ответы с готовыми решениями:

Последняя цифра чисел Фибоначчи
Последняя цифра чисел Фибоначчи Время на тест: 1 секунда. Программа должна по данному n,...

Последняя цифра произвольного числа
Нужно найти последнюю цифру произвольного числа a. Пример 2485 5 -93918 8

Не корректно присваивается последняя цифра числа для переменной
Код наподобие этого: #include &lt;iostream&gt; using namespace std; int main() { double...

Определить, является ли первая и последняя цифра числа одинаковой
Определить, является ли первая и последняя цифра числа одинаковой. на с++

18
Эксперт по математике/физикеЭксперт С++
2206 / 1411 / 411
Регистрация: 16.05.2013
Сообщений: 3,597
Записей в блоге: 6
27.11.2015, 08:30 2
Где-то это уже было https://www.cyberforum.ru/post7965087.html
0
Диссидент
Эксперт C
27707 / 17325 / 3810
Регистрация: 24.12.2010
Сообщений: 38,979
27.11.2015, 10:49 3
Цитата Сообщение от IrinaNovikova Посмотреть сообщение
return ((n - 1) + (n - 2))%10;
C++
1
return (get_last_digit(n - 1) + get_last_digit(n - 2))%10;
Однако, использование рекурсии в данном случае опасно из-за возможности переполнения стека. Да, в общем-то, и ни к чему.
0
Dimension
594 / 462 / 223
Регистрация: 08.04.2014
Сообщений: 1,710
27.11.2015, 11:07 4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <bits/stdc++.h>
using namespace std;
void f(int n) {
    int x = 1, y = 1,z;
    for (int i = 2;i <= n;i++) {
        z = (x + y) % 10;
        x = y;
        y = z;
    }
    cout << z;
}
int main() {
    int n;
    cin >> n;
    f(n);
    return 0;
}
1
4820 / 2286 / 287
Регистрация: 01.03.2013
Сообщений: 5,970
Записей в блоге: 29
27.11.2015, 16:17 5
Ilot, да в Симпсонах уже все было - числа Фибоначчи

Байт, в моем коте по ссылке тоже рекурсия - и ничего, все работает. А в коде непосредствено выше, вами оплюсованном - выдает неправильный ответ. (Да, я понимаю, что это вопрос с какого числа считать.)
0
9 / 4 / 0
Регистрация: 12.05.2015
Сообщений: 48
27.11.2015, 20:37  [ТС] 6
Цитата Сообщение от Байт Посмотреть сообщение
Однако, использование рекурсии в данном случае опасно из-за возможности переполнения стека. Да, в общем-то, и ни к чему.
Да, вы правы выдает ошибку "Failed test #1. Run time error:".
В задаче сказано, что нужно найти последнюю цифру n-го числа Фибоначчи.
Если я правильно понимаю, то грубо говоря нужно найти последнюю цифру числа n, т.е. Input: 560233 и эта цифра ровна 3 (560233). Правильно?
В коде С++ это выражается n%10??
Немного переделала код, но выдает ошибку "Failed test #1. Run time error:". Что делать?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <cassert>
#include <iostream>
 
class Fibonacci {
 public:
  static int get_last_digit(int n) {
    assert(n >= 1);
       if (n == 1 || n == 2) {
          return n;
      }
      return get_last_digit (n)%10;
    return n;
  }
};
 
int main(void) {
  int n;
  std::cin >> n;
  std::cout << Fibonacci::get_last_digit(n) << std::endl;
  return 0;
}
0
Диссидент
Эксперт C
27707 / 17325 / 3810
Регистрация: 24.12.2010
Сообщений: 38,979
27.11.2015, 20:42 7
IrinaNovikova, только я не понимаю, что делает ваш код. Имхо, он толчет воду в ступе, пока ступа не сломается. Посмотрите, что происходит, если на вход функции get_last_digit дать n=3
0
9 / 4 / 0
Регистрация: 12.05.2015
Сообщений: 48
27.11.2015, 20:43  [ТС] 8
Цитата Сообщение от Ilot Посмотреть сообщение
Где-то это уже было Последняя цифра чисел Фибоначчи
Сказали, что такую формулу нельзя использовать.
"Как минимум, для получения последней цифры больших чисел Фибоначчи нельзя использовать формулу "(((1+5^(1/2))/2)^d - ((1-5^(1/2))/2)^d ) / 5^(1/2)". Вычисления будут крайне неточны и так, разве что, можно получить только несколько первых цифр соответствующего числа Фибоначчи."
0
Dimension
594 / 462 / 223
Регистрация: 08.04.2014
Сообщений: 1,710
27.11.2015, 20:44 9
Цитата Сообщение от IrinaNovikova Посмотреть сообщение
грубо говоря нужно найти последнюю цифру числа n, т.е. Input: 560233 и эта цифра ровна 3 (560233). Правильно?
да ,только вы ерунду какую-то делаете
0
Диссидент
Эксперт C
27707 / 17325 / 3810
Регистрация: 24.12.2010
Сообщений: 38,979
27.11.2015, 20:51 10
IrinaNovikova, а чем вас не устраивает код из поста 4 ? Он совершенно правильный. Нумерация чисел Фибоначчи там начинается с 0.
А у вас в головке небольшая путаница. Вы понимаете разницу между числом n и n-ным числом Фибоначчи?
0
9 / 4 / 0
Регистрация: 12.05.2015
Сообщений: 48
27.11.2015, 21:06  [ТС] 11
Цитата Сообщение от Байт Посмотреть сообщение
IrinaNovikova, а чем вас не устраивает код из поста 4 ? Он совершенно правильный. Нумерация чисел Фибоначчи там начинается с 0.
А у вас в головке небольшая путаница. Вы понимаете разницу между числом n и n-ным числом Фибоначчи?
Код из 4 поста меня устраивает, но т.к. я только начала свой путь в С++ (самоучка), то мне еще пока трудно ориентироваться в коде и особенно в чужом. У меня возникают трудности в переводе кода из 4 поста в код программы, который нам дали на курсе. Что-то понимаю, а что-то не особо. , так что простите, если уж очень туплю.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <cassert>
#include <iostream>
 
class Fibonacci {
 public:
  static int get_last_digit(int n) {
    assert(n >= 1);
    // put your code here
    return n;
  }
};
 
int main(void) {
  int n;
  std::cin >> n;
  std::cout << Fibonacci::get_last_digit(n) << std::endl;
  return 0;
}
0
9 / 9 / 2
Регистрация: 03.04.2016
Сообщений: 89
09.04.2016, 12:26 12
Цитата Сообщение от Байт Посмотреть сообщение
а чем вас не устраивает код из поста 4 ? Он совершенно правильный.
Failed test #1. Wrong answer
Input:
193150
Your output:
9
Correct output:
5

Добавлено через 5 минут
Вот этот правильный:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <cmath>
long long fibb(long long n) {
    return (std::pow((1 + std::sqrt(5)) / 2 , n) - std::pow((1 - std::sqrt(5)) / 2 , n)) / std::sqrt(5);
}
long long last_number(long long n) {
    return fibb(n % 60) % 10;
}
int main() {
    int num;
    std::cin >> num;
    std::cout << last_number(num) << std::endl;;
}
0
Ilot
11.04.2016, 07:26
  #13

Не по теме:

AGPro, постыдились бы. Не стоит выдавать чужой код за свой. Даже двойную точку следования в 12 строке не исправили.

0
2686 / 2258 / 244
Регистрация: 03.07.2012
Сообщений: 8,219
Записей в блоге: 1
11.04.2016, 10:19 14
AGPro, а если бы требовалось не одна, а 9 цифр, то какой код правильный?
0
0 / 0 / 0
Регистрация: 28.03.2018
Сообщений: 16
06.02.2019, 21:55 15
Как добавить диапазон вводимых чисел в данный код. Например от 12 до 10000

Добавлено через 31 секунду
Цитата Сообщение от Dimension Посмотреть сообщение

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <bits/stdc++.h>
using namespace std;
void f(int n) {
 int x = 1, y = 1,z;
 for (int i = 2;i <= n;i++) {
 z = (x + y) % 10;
 x = y;
 y = z;
 }
 cout << z;
}
int main() {
 int n;
 cin >> n;
 f(n);
 return 0;
}
Как добавить диапазон вводимых чисел в данный код. Например от 12 до 10000
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12832 / 7569 / 1764
Регистрация: 25.07.2009
Сообщений: 13,965
17.07.2019, 17:23 16
Цитата Сообщение от IrinaNovikova Посмотреть сообщение
найти последнюю цифру n-го числа Фибоначчи
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
#include <cassert>
 
int fibo_tail(int n) {
    int head = 0, tail = 1, sum;
 
    assert(n > 0);
 
    while ( --n ) {
        sum = (head + tail) % 10;
        head = tail;
        tail = sum;
    }
 
    return tail;
}
 
int main() {
    int num;
 
    while ( std::cout << "Fibonacci order number: " && std::cin >> num ) 
        std::cout << "Last digit: " << fibo_tail(num) << std::endl;
    
    return 0;
}
Код
[andrew@andrew numbers]$ g++ -Wall LastFiboDigit.cpp 
[andrew@andrew numbers]$ ./a.out 
Fibonacci order number: 193150
Last digit: 5
Fibonacci order number:
Цитата Сообщение от Байт Посмотреть сообщение
Нумерация чисел Фибоначчи там начинается с 0
По условию задачи, из которой по легенде и появилась эта последовательность, начинаться с нуля она в принципе не может. Помните наверняка - про кроликов...

Цитата Сообщение от AGPro Посмотреть сообщение
Вот этот правильный
Только адски медленный. Если нужна последняя цифра, не за чем высчитывать число длиной в километр...
0
4820 / 2286 / 287
Регистрация: 01.03.2013
Сообщений: 5,970
Записей в блоге: 29
22.07.2019, 23:39 17
Цитата Сообщение от easybudda Посмотреть сообщение
Только адски медленный.
Все относительно Например, ваш кот на вход 1000000003 выдает 7 за
Код
Compilation time: 0.43 sec, absolute running time: 4.19 sec, cpu time: 5.5 sec, memory peak: 3 Mb, absolute service time: 4,63 sec
а мой по ссылке выше ту же 7 за
Код
Compilation time: 0.33 sec, absolute running time: 0.07 sec, cpu time: 0.01 sec, memory peak: 3 Mb, absolute service time: 0,41 sec
0
693 / 303 / 99
Регистрация: 04.07.2014
Сообщений: 846
24.07.2019, 17:47 18
C++
1
2
3
4
5
6
7
int fibo_tail(int n)
{
  int fs[] = {0, 1, 1, 2, 3, 5, 8, 3, 1, 4, 5, 9, 4, 3, 7, 0, 7, 7, 4, 1,
              5, 6, 1, 7, 8, 5, 3, 8, 1, 9, 0, 9, 9, 8, 7, 5, 2, 7, 9, 6,
              5, 1, 6, 7, 3, 0, 3, 3, 6, 9, 5, 4, 9, 3, 2, 5, 7, 2, 9, 1};
  return fs[n % (sizeof(fs) / sizeof(fs[0]))];
}
1
4820 / 2286 / 287
Регистрация: 01.03.2013
Сообщений: 5,970
Записей в блоге: 29
24.07.2019, 17:51 19
Тоже класс, все-таки кто-то не поленился и высчитал период
0
24.07.2019, 17:51
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.07.2019, 17:51
Помогаю со студенческими работами здесь

Определить является ли первая и последняя цифра числа одинаковой
В диалоговом режиме задаётся длинное целое число А (long int). Определить является ли первая и...

Вводятся числа a и b. Найти количество чисел в диапазоне [a;b], у которых последняя цифра равна 7.
Помогите пожалуйста с программой. Задание: Вводятся числа a и b. Найти количество чисел в диапазоне...

Вывести куб того числа, у которого в десятичном представлении последняя цифра меньше
Несколько целых чисел прочесть из текстового файла. Вывести куб того числа, у которого последняя...

Для натурального числа N определить, сколько раз в его записи встречается последняя цифра
Для натурального числа N определить, сколько раз в его записи встречается последняя цифра. Это...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru