LINUX.ORG.RU

Переход чисел в отрицательные в C++


0

1

Есть задание - найти X чисел из последовательности Фибоначчи. По непонятной мне причине, после этого места:

701408733
1134903170
1836311903
-1323752223
512559680
-811192543
Числа положительные стали перемежаться числами отрицательными. Реализация очень проста:
a=0
b=1
цикл из
c=a+b
a=b+c
b=a+c
c=a+b
a=b+c
b=a+c
Подскажите, пожалуйста, в чем собака зарыта? Вроде даже негде...

★★

Последнее исправление: Valdor (всего исправлений: 1)
Ответ на: комментарий от Google-ch

«нормальный», да уж... зачем в алгоритм, в котором каждая итерация - это одно сложение, ты ещё запихал и вычисление остатка от деления?

if(i % 2 == 1)

мегагецев нам не жалко, да?

// да, я понимаю, что в данном случае самым узким местом будет не деление, а запись в stdout.

qbe
()
Ответ на: комментарий от qbe

Ну можно считать еще быстрее

if (i & 0x01)
...

Правда компилятор может итак пользоваться этим приёмом когда считает остаток от деления на 2

deadline
()
Ответ на: комментарий от Valdor

Рекомендую не зарываться и не заставлять компьютер считать млрд. раз.

#include <iostream>
using namespace std;

int main()
{
    int amount,amounts;
    unsigned long long a,b,c;
    cout << "Сколько чисел из последовательности Фибоначчи вы хотите получить?" << endl;
    cin >> amount;
    if (amout > 40) {
        std::cout << "ПОШОЛ НА**Й" << std::endl;
        return 1;
    }
    a = 0;
    amounts = 0;
    cout << a << "\n";
    amounts++;
    b = 1;
    cout << b << "\n";
    amounts++;

    while ( amounts != amount ) {
    c = a+b;
    cout << c << "\n";
    amounts++;
    a = c+b;
    cout << a << "\n";
    amounts++;
    b = a+c;
    cout << b << "\n";
    amounts++;
}
    return 0;
}

Если хочется поизвращаться - вперёд реализовывать длинную арифметику, для сложения никаких проблем вообще нет. Суть проста: хранится массив чисел, например int32_t, а все вычисления идут с типом размера x2, соответственно int64_t. Для простоты можно в int32_t вообще хранить остаток от деления на 1млрд. - так проще будет печатать, получится что в одной ячейке массива хранится 9 разрядов десятичного числа.

Сложение - как на бумажке в столбик, вычисления идут в int64_t и при переполнении порога в 1млрд пишем остаток от деления на 1 млрд, частное в уме.

quiet_readonly ★★★★
()

переполнение беззнакового типа K&R иди поучи

anonymous
()
Ответ на: комментарий от yura_ts

Чтобы в принципе избавиться от конечности типа данных, тебе потребуется что-то вроде Haskell :)

Za4em? Mozno prosto napisat svoy class realizovivayuschiy dlinnuyu arifmetiku.

drull ★☆☆☆
()
Ответ на: комментарий от quiet_readonly

для сложения никаких проблем вообще нет.

из С нет доступа к флагу переноса, без ассемблера реализация длинной арифметики будет убогая и неполноценная ;)

Harald ★★★★★
()

Почитай хотя бы Кнута про системы счисления — том 2, глава 4. Там все очень доступно описано.

trycatch ★★★
()
Последнее исправление: trycatch (всего исправлений: 1)
Ответ на: комментарий от LongLiveUbuntu

Я давно уже не падаван :) Ну в Си, по-крайней мере. Да и вопрос не мой был.

А вообще про Фиббоначчи задача не очень интересная. Хочешь рекурсией решай, хочешь циклом, хочешь - формулой.

Интересней что-нибудь из ACM задачек порешать(да, знаю, попса)

deadline
()
Ответ на: комментарий от LongLiveUbuntu

Например http://acm.timus.ru/
или вот http://acm.sgu.ru/ или вот http://imcs.dvgu.ru/cats/

Причем последний принимает решения не только на Си и плюсах или паскале, но даже на хаскелле и руби.

Может задачки местами от жизни оторваны ( и спортивное программирование не нужно в жизни ), но отлично разминают мозги и прокачивают алгоритмическое мышление.

deadline
()
Ответ на: комментарий от Harald

Перфекционисты в треде. При 4 ядрах и 3ГГЦ на каждой кофеварке программисты ещё предлагают оптимизировать в (целых!) 2 раза и без того быстрый код. И не там, где в программе узкое место, а в студенческой лабе.

quiet_readonly ★★★★
()
Ответ на: комментарий от quiet_readonly

Ну ты такой мотивацией ещё прежложи Java, не беда же процессоров и памяти можно докупить. Я это не про этот код, а в общем.

bhfq ★★★★★
()
Ответ на: комментарий от quiet_readonly

4 ядра сабжевой задаче никак не помогут,

2 раза - это более чем достаточный повод для оптимизации, тем более в данном случае сложение больших чисел на ассемблере будет проще, чем на С.

В GMP например, для каждой поддерживаемой платформы своя ассемблерная реализация длинной арифметики

Harald ★★★★★
()
Ответ на: комментарий от Valdor

Твой пример работает только для amount кратных трем. Замени хотя бы на != на >=

marvin_yorke ★★★
()

Есть задание - найти X чисел из последовательности Фибоначчи. По непонятной мне причине, после этого места:

RTFM

MAX_INT === 2147483647

(для x86-32 & x86-64)

drBatty ★★
()
Ответ на: комментарий от Valdor

Сомневаюсь, что кого-либо волнует 100-200 число последовательности, но ощущение неприятное.

переходи на CommonLisp, там искароппки числа резиновые. А Over9000 вариантов программ найдёшь в SICP - лисперы обожают числа фиббоначи.

drBatty ★★
()
Ответ на: комментарий от alexeiz

Пробовал Pascal - не понравился. Уже не помню, чем, но не понравился.

Valdor ★★
() автор топика
Ответ на: комментарий от drBatty

Это мой код и никому кроме меня он не нужен. Не все ли равно, какой он? Тем не менее - ГДЕ отступов не хватает?

Valdor ★★
() автор топика
Ответ на: комментарий от Valdor

Это мой код и никому кроме меня он не нужен. Не все ли равно, какой он?

ты хочешь, что-бы его кто-то _прочитал_ ? Если нет, то пиши как хочешь.

Тем не менее - ГДЕ отступов не хватает?

http://ru.wikipedia.org/wiki/Отступ_(программирование)

drBatty ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.