1

Тема: [C++] число Фібоначі

Екзамен з С++

Привіт, ґайс, наступного тижня в мене екзамен в вузі (препод дуже прискіпливий), потрібна допомога/ментор, який навчить розв'язувати проблеми на плюсах.. (не складні). Ось приклад задачі з екзамену:

Обрахуйте 100 число Фібоначі, використоваючи функцію fib() (результат має бути точним, це число не поміститься в будь-яку змінну).

Напишіть в приватку, якщо є бажання :(

2 Востаннє редагувалося Firefox is dead (02.04.2023 11:43:32)

Re: [C++] число Фібоначі

ChatGPT вам на допомогу
https://chat.openai.com/chat
завдання навіть за вас зробить
вчитись навіть не потрібно
також вона пояснить кожен рядок коду

GPT написав:

Ось код на C++, який обчислює 100-те число Фібоначчі за допомогою рекурсивної функції fib():

#include <iostream>
using namespace std;

void fib(long long a[], int n) {
    if (n < 2) {
        return;
    }
    a[0] = 0;
    a[1] = 1;
    for (int i = 2; i < n; i++) {
        a[i] = a[i-1] + a[i-2];
    }
}

int main() {
    long long fib_num[100];
    fib(fib_num, 100);
    cout << "100th Fibonacci number is: " << fib_num[99] << endl;
    return 0;
}

Цей код використовує рекурсивну функцію fib(), яка заповнює масив a[] з першими n числами Фібоначчі. У функції main() ми викликаємо fib() з масивом розміру 100 і виводимо 100-те число Фібоначчі, яке знаходиться в fib_num[99].

upd: ХАЛТУРА!!!!

GPT new написав:
#include <iostream>
using namespace std;

long long fib(int n, long long a, long long b) {
    if (n == 0) {
        return a;
    }
    return fib(n-1, b, a+b);
}

int main() {
    long long fib_num = fib(100, 0, 1);
    cout << "100th Fibonacci number is: " << fib_num << endl;
    return 0;
}

Ця функція fib() також обчислює n-те число Фібоначчі, але вона приймає додаткові аргументи a та b, які є попередніми двома числами Фібоначчі. Якщо n дорівнює 0, то функція повертає a. Інакше, вона повертає результат рекурсивного виклику fib() з аргументами n-1, b та a+b. У функції main() ми викликаємо fib() з аргументами 100, 0 та 1 і виводимо результат.

3

Re: [C++] число Фібоначі

Нащо мені чат, якщо я хочу сам навчитись, та і в цьому випадку чат обчислив це рекурсивно - в лонг лонг це число не вміститься)

Подякували: leofun011

4

Re: [C++] число Фібоначі

Прихований текст

Ось би хлопчика, який розбирається в ++ 8)

5

Re: [C++] число Фібоначі

andrii15 написав:

Нащо мені чат, якщо я хочу сам навчитись, да і в цьому випадку чат обчислив це рекурсивно - в лонг лонг це число не вміститься)

ваш наш

GPT написав:

Ось приклад коду на C++ з використанням бібліотеки GMP для обчислення 100-го числа Фібоначчі з точністю до 1000 цифр:

#include <iostream>
#include <gmpxx.h>

using namespace std;

mpz_class fib(int n) {
    mpz_class a, b, c;
    a = 0;
    b = 1;
    for (int i = 1; i <= n; i++) {  // використовуйте параметр n замість сталої 100
        c = a + b;
        a = b;
        b = c;
    }
    return a;  // повертаємо число Фібоначчі
}

int main() {
    cout << fib(100) << endl;  // Виведе 354224848179261915075
    return 0;
}

У цьому прикладі ми використовуємо клас mpz_class з бібліотеки GMP для зберігання цілочисельних значень з довільною точністю. Починаємо з a = 0 і b = 1 і обчислюємо наступне число Фібоначчі в циклі, зберігаючи значення a і b для наступної ітерації. Виводимо результат за допомогою cout.

andrii15 написав:
Прихований текст

Ось би хлопчика, який розбирається в ++

бажаєм знайти ._.

6

Re: [C++] число Фібоначі

#include <iostream>
using namespace std;

int main() {
  unsigned long fib[101];
  fib[0] = 0;
  fib[1] = 1;
  for (int i = 2; i <= 100; i++) {
    fib[i] = fib[i-1] + fib[i-2];
  }
  cout << "The 100th Fibonacci number is: " << fib[100] << endl;
  return 0;
}

Не читайте, тут дурня! :)


Доречи в лонг влазить, але я хотів був повумнічати і написати власний тип данних, а потім згадав що то є Сіпп, на якому я ніц не розуміюсь

Подякували: Firefox is dead1

7 Востаннє редагувалося wander (02.04.2023 16:04:41)

Re: [C++] число Фібоначі

Chemist-i написав:

Доречи в лонг влазить

Нє-а, не влазить.

Chemist-i написав:

я хотів був повумнічати і написати власний тип данних

Можна і окремий тип, можна взяти готову бібліотеку, як це зробив ChatGPT, але у такій ситуації - можна обійтись без цього. Щоб записати 100 число Фібоначчі, нам достатньо двох змінних, які ми будемо репрезентувати як одне ціле число, зберігаючи верхню та нижню половини числа Фібоначчі. А взагалі, це в нас тема з Довгої арифметики.

Прихований текст
#include <iostream>
#include <iomanip>
constexpr auto half = std::uint64_t{1000000000000};

int main() {
    // 98th: 83621143489848422977
    auto fib98_high = std::uint64_t{83621143    };
    auto fib98_low  = std::uint64_t{489848422977};
    
    // 99th: 135301852344706746049
    auto fib99_high = std::uint64_t{135301852   };
    auto fib99_low  = std::uint64_t{344706746049};
    
    // 100th = 98th + 99th
    auto fib100_high = std::uint64_t{};
    auto fib100_low  = std::uint64_t{};
    
    fib100_high = fib98_high + fib99_high;
    fib100_low  = fib98_low  + fib99_low;
    // carry mod 10^18 
    fib100_high += fib100_low / half;
    fib100_low  %= half;

    // The 100th Fibonacci number is 218,922,995,834,555,169,026
    // when 0 is counted as 1st and 1 is counted as 2nd.
    std::cout << fib100_high << std::setw(12) << fib100_low;
}
Подякували: Firefox is dead, Chemist-i, leofun013

8

Re: [C++] число Фібоначі

wander, хіба не 2^64? Я вже був глянув, що від архітектури залежить, у мене вінда х64, у мене влазить :)

9

Re: [C++] число Фібоначі

Chemist-i написав:

wander, хіба не 2^64? Я вже був глянув, що від архітектури залежить, у мене вінда х64, у мене влазить :)

А хіба Win64 не LLP? Тобто 64 біти лише long long і вказівники, а просто long 32-бітний?

Подякували: leofun011

10

Re: [C++] число Фібоначі

Chemist-i написав:

wander, хіба не 2^64? Я вже був глянув, що від архітектури залежить, у мене вінда х64, у мене влазить :)

(2^64)-1 =  18446744073709551615
fib(100) = 218922995834555169026

11

Re: [C++] число Фібоначі

ReAl, що таке LLP?
wander, у мене фіб100 вийшло

3736710778780434371

ЩЯРНТ?

упд, а тут ще інше

12

Re: [C++] число Фібоначі

Схоже що таки не влізло, через це я так сильно опозорився. Я щось порахував, що 20 знаків, а там насправді 21 і воно переповнилось і тому така маячня вийшла.

Подякували: Firefox is dead1

13

Re: [C++] число Фібоначі

Chemist-i написав:

що таке LLP?

Abstract Data Models

[...]
In 64-bit Windows, this assumption of parity in data type sizes is invalid. Making all data types 64 bits in length would waste space, because most applications do not need the increased size. However, applications do need pointers to 64-bit data, and they need the ability to have 64-bit data types in selected cases. These considerations led to the selection of an abstract data model called LLP64 (or P64). In the LLP64 data model, only pointers expand to 64 bits; all other basic data types (integer and long) remain 32 bits in length.

Chemist-i написав:

wander, у мене фіб100 вийшло

3736710778780434371

ЩЯРНТ?

Integer overflow

Chemist-i написав:

упд, а тут ще інше

Ну, читайте, що я пишу

The 100th Fibonacci number is 218,922,995,834,555,169,026 when 0 is counted as 1st and 1 is counted as 2nd.

На сайті, що ви скинули, рахують starting from 0, отже у їх таблиці це 99 число, а не 100.

Подякували: Chemist-i, ReAl2

14

Re: [C++] число Фібоначі

wander, дякую!

15

Re: [C++] число Фібоначі

його можна порахувати, якщо остачу з ділення на 10 записувати в vector або таблицю

16 Востаннє редагувалося Firefox is dead (02.04.2023 21:52:22)

Re: [C++] число Фібоначі

andrii15 написав:

його можна порахувати, якщо остачу з ділення на 10 записувати в vector або таблицю

та, давайте одразу

#include <iostream>

double sqrt5 = 2.2360679775;
double golden_ratio = (1 + sqrt5) / 2;

void fibonacci(int n) {
    double result = 1;
    
    for (int i; i<n; i++) {
        result = result * golden_ratio;
    }

    std::cout << "Число Фібоначі під номером "
              << n
              << " = "
              << result / sqrt5
              << std::endl;
}

int main() {
    int n;
    std::cout << "Введіть номер числа Фібоначі: ";
    std::cin >> n;
    fibonacci(n);
    return 0;
}
компілятор написав:

Введіть номер числа Фібоначі: 100
Число Фібоначі під номером 100 = 3.54225e+20

UPD:

3542248... (заокруглення 8 саме те :D)
число має 21 символ, як і реальне число фібоначі під номером 100

якщо сумніваєтесь що там може бути дробова частина, можна додати
(похибка ~0.0001%)

#include <string>

double round_number(double number) {
    std::string str = std::to_string(number);
    std::size_t dot_pos = str.find('.');
    if (dot_pos == std::string::npos) {
        return number;
    }
    std::string whole_part = str.substr(0, dot_pos);
    return std::stod(whole_part);
}

cmath та math.h не використовуєм!

17

Re: [C++] число Фібоначі

Chemist-i написав:

wander, хіба не 2^64? Я вже був глянув, що від архітектури залежить, у мене вінда х64, у мене влазить :)

Ну та Ви ще зара занурте студента в подробиці багатопотічності, за запропонуйте ті всі лонги розподілити по кількості ядер які маються в наявності .. ))

Подякували: Firefox is dead1

18

Re: [C++] число Фібоначі

Chemist-i написав:

ReAl, що таке LLP?

LLP64 -- 64-бітними є long long і pointer.
Linux/64 є LP64 (64-бітними є вже й long ну й звісно pointer)

Подякували: Chemist-i1

19 Востаннє редагувалося Droid 77 (02.04.2023 21:46:08)

Re: [C++] число Фібоначі

ReAl написав:
Chemist-i написав:

ReAl, що таке LLP?

LLP64 -- 64-бітними є long long і pointer.
Linux/64 є LP64 (64-бітними є вже й long ну й звісно pointer)

Тобто 32-ох бітних вказівників не буває?
До чого тут вказівники?

20 Востаннє редагувалося wander (02.04.2023 23:03:15)

Re: [C++] число Фібоначі

Firefox is dead написав:

Число Фібоначі під номером 100 = 3.54225e+20

andrii15 написав:

результат має бути точним

Firefox is dead, зможете знайти відмінність між цими твердженнями? Можете попросити допомоги у ChatGPT.

Droid 77 написав:

Тобто 32-ох бітних вказівників не буває?
До чого тут вказівники?

Вже ж і посилання готові дали, все одно так важко відкрити і почитати?

Подякували: leofun01, Firefox is dead, Chemist-i3