Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не работает длинная арифметика, не принимает 
:(
    Опции темы
Innk
Дата 20.2.2011, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 7.8.2010

Репутация: нет
Всего: нет



http://acm.mipt.ru/judge/problems.pl?probl...7b6b2aef495be49
Числа Фибоначчи для  n < 1000. 

Выдаёт ошибку на 7 тесте, не понимаю почему - вроде всё правильно вычисляет

Код

#include <iostream>
unsigned long int m1[24],m2[24],m3[24];

int main()
{
    int n,j;

    scanf("%d",&n);
    for(j=1;j<24;j++)
    {
        m1[j]=0;
        m2[j]=0;
    }
    m1[0]=0;
    m2[0]=1;
    m3[0]=1;
    for(int i=0;i<n;i++)
    {
        for(j=0;j<24;j++)
            m3[j]=0;
        for(j=0;j<24;j++)
        {        
            m3[j]=m3[j]+(m1[j]+m2[j]) ;

            if(m3[j]>=1000000000)
            {
                m3[j]=m3[j]-1000000000;    
                m3[j+1]=1;
            }
        }
        for(j=0;j<24;j++)
        {
            m1[j]=m2[j];
            m2[j]=m3[j];
        }
    }

    j=23;
    while(m3[j]==0)j--;
    while(j>=0)
    {
        printf("%d",m3[j]);
        j--;
    }
    return 0;
} 



Может вывод неправильный

Или как лучше сделать простую длинную арифметику ??
PM MAIL   Вверх
volatile
Дата 20.2.2011, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



В ваш код особо не вникал. Но бросилось в глаза это:
Цитата(Innk @  20.2.2011,  11:08 Найти цитируемый пост)
       printf("%d",m3[j]);

Вывод съедает незначащие нули.

Напишите так
Код

        printf("%09d",m3[j]);


Добавлено через 8 минут и 10 секунд
и еще,
Цитата(Innk @  20.2.2011,  11:08 Найти цитируемый пост)
               m3[j+1]=1;

при переполнении будет писать за границу массива,

PM MAIL   Вверх
Innk
Дата 20.2.2011, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 7.8.2010

Репутация: нет
Всего: нет



volatile, Спасибо !!!!

Точно, все после первого надо выводить с лидирующими нулями - об этом совсем неподумал

Код

    j=23;
    while(m3[j]==0)j--;

    printf("%d",m3[j]);//первый без лидирующих нулей
    j--;
    while(j>=0)
    {
        printf("%09d",m3[j]);//а все остальные выводим с лидирующими нулями!!!
        j--;
    }
    return 0;


При n<1000 моих массивов m[24] в которых числа с 9 знаками = 24*9=216 хватает
Так что переполнения не будет.

Всё прошла сразу за 0.01 )

Это сообщение отредактировал(а) Innk - 20.2.2011, 15:02
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0467 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.