Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Флейм > Bash.org.ru ест мозг !


Автор: Nikita27 13.6.2009, 16:29
Цитата

"xxx: 3.49(очень много цифр)*10^5768 - кстати вот он, факториал числа 2010... Просто стало любопытно очень, как бы такое посчитать и сколько нулей там будет. Есесно "в лоб" такое не посчитаешь, тем более с такой огромной точностью (аж 1024 бита! Это очень много), тем более типов данных с такой точностью нет и даже массивы не совсем помогут, ибо тогда ещё и много времени уйдёт на "распиховку" по массиву. В сети способов посчитать сие не нашёл, везде уже на числах порядка 200 комп грузицо на минуты две, а в ответе низкая точность (как правило, около 32 бит). Поэтому пришлось извращаться - расчёт вёлся небольшими интервалами и разбиением всей процедуры на почти одинаковые участки, в случае небольших разниц (из разряда как быстро посчитать 3050, 3100, 3000, 3150 умноженное на 25, не умножая каждое число) они учитывались, а также выносились возможные сомнжители. Суммарное время вычисления - около 2 секунд.
yyy: Вася, покидай свой мехмат, ты долбанулся ещё сильнее!!!

Вот такую цитату я нашел на башорге... И написал программу, которая считает этот факториал с использованием массивов:
Код

#include <iostream>

using namespace std;

int main() {
    int n, carry = 0, tmp = 0, F[10000], last = 0;
    memset(F, 0, sizeof(F));
    cin >> n;
    F[ last++ ] = n;
    for(int i = 1; i < n; i++) {
        carry = 0;
        for(int j = 0; j <= last; j++) {
            tmp = F[j] * i;
            F[j] = tmp % 10000 + carry;
            if(F[j] >= 10000) {
                carry = tmp / 10000 + F[j] / 10000;
                F[j] %= 10000;
            }
            else {
                carry = tmp / 10000;
            }
        }
        if(carry > 0) {
            F[ ++last ] = carry;
            carry = 0;
        }
    }
    cout << F[last];
    for(int i = last - 1; i >= 0; i--) {
        (F[i]<10) ? cout << "000"    << F[i] :
        (F[i]<100) ? cout << "00"    << F[i] :
        (F[i]<1000)?cout << "0"    << F[i] : cout << F[i];
    }
    return 0;
}


Написание этой программы заняло 20 минут... Время, за которое считает эта программка факториал 2010 можете посчитать сами )))

Автор: GrayCardinal 14.6.2009, 19:17
Цитата

Вася, покидай свой мехмат, ты долбанулся ещё сильнее!!!

 smile 

Автор: th1nker 15.6.2009, 15:56
 smile Клево считает, молодец!

Автор: Borland_Delphi_6 17.6.2009, 16:05
Вычисление в Wolfram Mathematica - менее секунды. Постановка задачи в той же среде - около 1.5 секунд на набор строки 
Код

2010!


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)