Форум программистов, компьютерный форум CyberForum.ru

факториал 3000 - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 30, средняя оценка - 4.97
^Tecktonik_KiLLeR
 Аватар для ^Tecktonik_KiLLeR
1144 / 426 / 19
Регистрация: 23.06.2009
Сообщений: 6,141
Завершенные тесты: 1
12.11.2010, 18:12     факториал 3000 #1
как можно написать прогу,которая на экран записывает число равное факториалу 3000?
я попробовал но буквы какие то выводит
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.11.2010, 18:12     факториал 3000
Посмотрите здесь:

C++ Факториал в С
C++ Факториал
C++ факториал
C++ факториал в С++
C++ Факториал Си
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
12.11.2010, 18:30     факториал 3000 #2
Ну так. Ни в один стандартный тип это не поместится. Надо писать длинную арифметику.
^Tecktonik_KiLLeR
 Аватар для ^Tecktonik_KiLLeR
1144 / 426 / 19
Регистрация: 23.06.2009
Сообщений: 6,141
Завершенные тесты: 1
12.11.2010, 20:19  [ТС]     факториал 3000 #3
silent_1991, это как?Дин.массивы?
Day
 Аватар для Day
1149 / 954 / 57
Регистрация: 29.10.2009
Сообщений: 1,384
12.11.2010, 20:28     факториал 3000 #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Посмотри маленькую библиотечку
Вложения
Тип файла: zip LONG.ZIP (1.9 Кб, 67 просмотров)
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
13.11.2010, 01:37     факториал 3000 #5
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
>>> def fact(n):
...   base = 1
...   while n > 1:
...     base *= n
...     n -= 1
...   return base
... 
>>> fact(3), fact(0)
(6, 1)
>>> fact(3000)
 
...
 
>>> len(str(fact(3000)))
9131
>>>
то есть ты само число хранишь в массиве (в массиве разрядов числа), там же умножаешь и переносишь переполнение в старший разряд
^Tecktonik_KiLLeR
 Аватар для ^Tecktonik_KiLLeR
1144 / 426 / 19
Регистрация: 23.06.2009
Сообщений: 6,141
Завершенные тесты: 1
13.11.2010, 08:31  [ТС]     факториал 3000 #6
Day, учитель сказал что лон не поможет
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
13.11.2010, 09:09     факториал 3000 #7
^Tecktonik_KiLLeR, что значит "лон не поможет"? В смысле лонг? Ну так про него и речи не было, говорилось о длинной арифметике - т.е. операции с большими числами.
^Tecktonik_KiLLeR
 Аватар для ^Tecktonik_KiLLeR
1144 / 426 / 19
Регистрация: 23.06.2009
Сообщений: 6,141
Завершенные тесты: 1
13.11.2010, 09:27  [ТС]     факториал 3000 #8
silent_1991, значит как??

Добавлено через 1 минуту
я ничего не понял из лонг.с, Day
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
13.11.2010, 09:29     факториал 3000 #9
Значит так. Большие числа можно реализовать в виде массива, каждый элемент которого - разряд большого числа. Далее реализовать арифметические операции над этими числами (по сути алгоритмы сложения, умножения, вычитания и деления столбиком, главное - позаботиться о правильном переносе разрядов). Ну а дальше факториал реализуется на основе уже описанных операций сложения и умножения.
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
13.11.2010, 09:37     факториал 3000 #10
пример
Day
 Аватар для Day
1149 / 954 / 57
Регистрация: 29.10.2009
Сообщений: 1,384
13.11.2010, 12:54     факториал 3000 #11
Цитата Сообщение от ^Tecktonik_KiLLeR Посмотреть сообщение
silent_1991, значит как??

Добавлено через 1 минуту
я ничего не понял из лонг.с, Day
Т.к. в сферу моих интересов входит работа с о-о-0чень большими числами, я применил для их представления динамические массивы (XXL) к которым по мере надобности прибавляются куски по 20 разрядов. Разряд содержит около 64000 цифр (unsigned short). А дальше идет просто арифметика, как нас учили складывать и умножать в школе, только циферки побольше. Для твоих целей (если тебе надо посчитать просто 3000! и об этом забыть) подойдут и более простые представления в виде конечных массивов которые предлагают другие участники топика. Я не настаиваю на том, что мое - самое лучшее, просто все уже было готово - не хочешь - не бери.

ЗЫ. В моем представлении есть еще один недостаток - не так-то просто представить полученный результат в виде десятичного числа, но и эта задача решена. Если кто заинтересуется - пожалуйста.
M128K145
Эксперт C++
 Аватар для M128K145
8272 / 3491 / 142
Регистрация: 03.07.2009
Сообщений: 10,707
13.11.2010, 16:03     факториал 3000 #12
Сообщение было отмечено автором темы, экспертом или модератором как ответ
main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include "factorial.h"
 
int main()
{
    setlocale(LC_ALL, "Russian");
 
    Factorial *factorial = new Factorial();
    int fact;
 
    std::cout<<"Введите факториал:\n> ";
    std::cin>>fact;
 
    factorial->PrintFactorial(fact);
 
    delete factorial;
    return 0;
}
factorial.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#ifndef FACTORIAL_H_
#define FACTORIAL_H_
 
class Factorial
{
public:
    void WriteFactorial(int);
    void PrintFactorial(int);
protected:
private:
    void _Factorial(int);
    static const int n = 1500000;
    int mas[n];
};
 
#endif /* FACTORIAL_H_ */
factorial.cpp
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include <iostream>
#include <fstream>
#include "factorial.h"
 
void Factorial::_Factorial(int factorial)
{
    int fact, i, zero = n - 1, index = n - 1;
    for(i = 0; i < n - 1; ++i)
        mas[i] = 0;
    mas[n - 1] = 1;
    for (fact = 2; fact <= factorial; ++fact)
    {
        while (mas[zero] == 0) --zero;
        for (i = zero; i >= index; --i)
            mas[i] *= fact;
        for (i = zero; i > index; --i)
            if (mas[i] >= 1000)
            {
                mas[i - 1] += mas[i] / 1000;
                mas[i] %= 1000;
            }
        if (mas[index] >= 1000)
        {
            mas[index - 1] += mas[index] / 1000;
            mas[index] %= 1000;
            index--;
            if (mas[index] >= 1000)
            {
                mas[index - 1] += mas[index] / 1000;
                mas[index] %= 1000;
                index--;
                if (mas[index] >= 1000)
                {
                    mas[index - 1] += mas[index] / 1000;
                    mas[index] %= 1000;
                }
            }
        }
    }
}
 
void Factorial::WriteFactorial(int factorial)
{
    _Factorial(factorial);
    int i = 0;
    while (mas[i++] == 0);
    std::ofstream out("factorial.txt", std::ios::out);
    for (i -= 1; i < n; ++i)
    {
        if (mas[i] >= 100)
            out<<mas[i];
        else
            if (mas[i] < 10)
                out<<"00"<<mas[i];
            else
                out<<"0"<<mas[i];
    }
}
 
void Factorial::PrintFactorial(int factorial)
{
    _Factorial(factorial);
    int i = 0;
    while (mas[i++] == 0);
 
    for (i -= 1; i < n; ++i)
    {
        if (mas[i] >= 100)
            std::cout<<mas[i];
        else
            if (mas[i] < 10)
                std::cout<<"00"<<mas[i];
            else
                std::cout<<"0"<<mas[i];
    }
}
3000!
41493596034378540855568670930866121709511191949318099176894676576975585651235319500860007652178003420075184635383617118495750871114045907794553402161068339611621037904199177522062663390179682805164719697495968842457728766097103003726111095340241127118833157738815328438929737613021106312930374401485378725446079610290429491049793888120762511625132917004641668962117590203575175488980653577868915285093782469994674699190832093511068363824287063522268544339213775150488588104036818809099292912497141900508938994404715351473154531587441509960174267875087460367974117072368747277143988920683691618503608198459718093784453523958505377611086511162363145920886108557450874513945305436213711898150847192094426374203275029996333784944014775671414680824207499914714878359669720638954670589960178569480263388767112871068004950827400717124819476386401369193544354120312786601434792549959143530120653103406625503231020738351502195103148673612338739395096551462159349015789949944072311004426924838140141455487872738045856023561583204317945953055830693351246890721246151468485308724031267967089113548982733475375756899365176396424781733462510879015743437398920492267098317033932107176343983352444576040476565400414414699479984354554597799386702839428513413188913165695310848513525094006147774047007331406541794428004436691903685469270857271701648011512057452448607968773784803660653009109815639091294110633715621540903800135058671624262333902434166628716521228590274568833504897926869369792878376894841436573866436955075473964882256222183380014600761196859217603234808467455216330411738004331144225926243690558782914907973885758784585739828695390302383837265882427654306437517757897215045071361801730051628424476294227485755627828763498767195281368913583918824499284741591683130334032199946752082914885764345863832313545205075955912062067273296951386122994658607527317884452449865348164169238844889061495850934373442889814884427321817131272533891534506581143823381205875379808605080889761753882896252933633750454549168600267229591225528854584482686655324313011353754812409561237686078007700707939541848907149467377854407528307872988103912945121929864793703451257436445581459757140822705986325165352906584571123585270211933452981105568398809884094980346185078025273038736784042169427237980464304250045030806637032760016341921442805708802430850567892108646977455139539119838636167190300278146380136932482332771595180596193069504237836082620570887209297929797429404576877338319877444685544294800321741056689423710545028870419611915072739000031642014474213323293871618029555614004602867400422885389854650328028428515122296028795741801621823236098320971441047012533067314896153236788734984553949604397050352347766211395914519270422122231426998692087463520980686224354813376194395131942868113486531562228173214976481705381846155326596187530296478601160872263640443922257601926494610916885151013143945574398303192557154162151442469122370519149097861849436150963109933639594561796593396851958605338631176324147066842257192394742531726479559749993283247279807896470753054014194090200609712674753186365525403212757757853930697530056595208207457499471898144453772248207888443335118545601568853708182892895218300139654376947286418776665762815389737340159410543681435437346134244692067070082782423645557450882556670157242752810317141640631410681384330924027281318960884813040665226169552825637183862464944295688859393846726723694199475571320546018263425731029115353532728808182773021596787088437293412117084511580629967697266601663635276959969021502122104954259567278593185516268447100374434620422003535391203738393095420695021486207390653190910821344334251497896284236198571674773848126097443055036250866354720730971298084697196537722779893160200560725058007512407494448163392214398118492748281978655178478547749198714138485042290383954090570842038137277135667703565041081780520695032136233521692740531015340921761834078817735674646749071616600653230438902639786065509005309872435445689315601329942407112295015453771521051942445512795364971214872222193729289159833001742397977592530501318837883494884232222507318816399438935627817102875432588794558857742780390717166381257903798149148445526885871629931014510733215554773264576035916184298708323237568837917135073006026738292294687081030751946020376438138677107333779312582257356435534577162804030480925785909747233413932904072239860005448269296110393640127539539899397420021925268928622564959279136369546983247314494094297494213208716963662812963846191378114609210701033012119934264941666449130310898493535366401831282683112506578386425906537197010907276429330534751297336716929415047870949241778121534979499449732358445130210029720359993576507730563696950539990891252004810120090569633144368179194247963563389102486250773367249399801723451627048850149438343735826440053481474957421328873648479589553843836378275601433377798816126854462406494134416119108952653326761627660221130879211665924379496534838030236064294981985541014311566601739518539426008673198564586684635442730180022292607589767192198367529528365158715521887698317999005853121518691037776676883654291247419826099434535671529412823837612115555686210454583810355154404953718470726363218532775486501811002621331228429860926112159573066023932077476742800909462674322138805290643067711276964013735906251051050623568241317651533030775358975134565147424167401517470720839101869989993279364910892687924739705814152855543965954222603919059265825637344676406359525838966981511983959886603683753042017990328185945569412550519066302854869533377682984600031808093822130038102214387057461181304251961916405970456035183121708151658647356556540532928411748628957082856792300053525846377061280591452035546389932127875906349627837975871352588618213252263577038396202737385324908353680497990085701522483303439525197344653342994652565236096742834550523739733902374261808871799283722285366293439240895762913154442106573609205481842139365893867715542842477275100166734357743093638948444564764377184073874379471007867151070449554657626281566137550730763768080600031844296233977808233311359787577136983012817571625671683287281511937336685789437109097748581222868126824122317272681184975207863453107495331708260153159440253645365524453587952034745213429248916644504804355352281977721981971869054884176896398782704782066126921472548618247859626434279190274503452994769367997217285165465591799471789067885687278574470084289723778234763080740919512966238346427839653865017324665850192144091694630371265581197700774682562035198318782913591013997817303635173764706714383992810291224460848320518983248348855131025539721583184931653670732273172995431750775475634748127320956655431851879586978172491721700865768098908327830838240437737974455342525688712898855513180967012497859454290609627370590659970784172738420721605576789060565167694565490120388165775861939230924362983389549857279874523398090499858467484850399509109398834210424693113617875978611803096108774362764990414655167545507613665725914993376114340243762910290384135888531312591132544849225896007184851169390193985434649415483782338302531368775990005443722332901462568184095998830522521585328599833990336595418932696680163265899358234663247080324020429791357425755498549372896192091650794671997121439832581553945835125648010889886887056882711222628734035772418424803231173027338442220604015609242079569493204943809402465562530303328824165302038006041288444384884189129393985971765670211501611340121169355535864984802941563238279447576315042685734269863116562800932164578165410411899078396210758605145091526528422433647230880469088426412525126584729134059195171754291152622002229756986927959124620964363057052133099216422258437651889193630329851223282950806126200573565554213183555838289318138795940962303792777230344423432341561603558590502324475274502630869831414125396371754413611897269158650716722308083435295578401087236027347001118786146233185439431057058483770474806035004556885020602730222256397630738939985024978155182679916994164145540329909813190506654358156657691529068908186204138444091456355291242064901717436430473455191375922914953282988151808740076733486997695322871450791584448703980405737673555777873593937891577147956023340708456392314170118392555234618119775915673385955919265270624063734277760215846511035368057963320714896942663358570375305829676608224208465464558556667889222627619990263961792637457851652540918756608543859661221944248720424960000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
^Tecktonik_KiLLeR
 Аватар для ^Tecktonik_KiLLeR
1144 / 426 / 19
Регистрация: 23.06.2009
Сообщений: 6,141
Завершенные тесты: 1
20.11.2010, 20:29  [ТС]     факториал 3000 #13
M128K145, пожалуйста прокомментируйте код
Day
 Аватар для Day
1149 / 954 / 57
Регистрация: 29.10.2009
Сообщений: 1,384
20.11.2010, 20:52     факториал 3000 #14
Цитата Сообщение от ^Tecktonik_KiLLeR Посмотреть сообщение
M128K145, пожалуйста прокомментируйте код
Попробовал бы сам - на пользу пойдет!
^Tecktonik_KiLLeR
 Аватар для ^Tecktonik_KiLLeR
1144 / 426 / 19
Регистрация: 23.06.2009
Сообщений: 6,141
Завершенные тесты: 1
21.11.2010, 10:46  [ТС]     факториал 3000 #15
Day, попробовал-не могу,поэтому и прошу чтобы утт прокомменировали...надо мне для понедельника
M128K145
Эксперт C++
 Аватар для M128K145
8272 / 3491 / 142
Регистрация: 03.07.2009
Сообщений: 10,707
21.11.2010, 12:48     факториал 3000 #16
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
// В каждом элементе массива хранится число [0, 999]
// Разборка переполнения состоит в том, что в текущий элемент массива
// записывается остаток от деления значения на 1000, потом это значение 
// делится на 1000 и суммируется со старшим по разрядности элементом
 
void Factorial::_Factorial(int factorial)
{
    int fact, i, zero = n - 1, index = n - 1;
    //---- Задаем 0! или 1!
    for(i = 0; i < n - 1; ++i) 
        mas[i] = 0; 
    mas[n - 1] = 1;
    //------------------------------
    for (fact = 2; fact <= factorial; ++fact)
    {
        while (mas[zero] == 0) --zero; // ищем первый ненулевой элемент
        //старший десятичный разряд
 
        //---- Выполняем вычисление fact!
        for (i = zero; i >= index; --i) 
            mas[i] *= fact;
        //------------------------------
 
        //---- Разбираем переполнение в старшем десятичном разряде
        for (i = zero; i > index; --i)
            if (mas[i] >= 1000)
            {
                mas[i - 1] += mas[i] / 1000;
                mas[i] %= 1000;
            }
        //------------------------------
 
        //---- Разбираем переполнение в остальных десятичных разрядах
        if (mas[index] >= 1000)
        {
            mas[index - 1] += mas[index] / 1000;
            mas[index] %= 1000;
            index--;
            if (mas[index] >= 1000)
            {
                mas[index - 1] += mas[index] / 1000;
                mas[index] %= 1000;
                index--;
                if (mas[index] >= 1000)
                {
                    mas[index - 1] += mas[index] / 1000;
                    mas[index] %= 1000;
                }
            }
        }
        //------------------------------
    }
}
^Tecktonik_KiLLeR
 Аватар для ^Tecktonik_KiLLeR
1144 / 426 / 19
Регистрация: 23.06.2009
Сообщений: 6,141
Завершенные тесты: 1
21.11.2010, 15:25  [ТС]     факториал 3000 #17
Цитата Сообщение от M128K145 Посмотреть сообщение
#ifndef FACTORIAL_H_ #define FACTORIAL_H_ class Factorial { public: void WriteFactorial(int); void PrintFactorial(int); protected: private: void _Factorial(int); static const int n = 1500000; int mas[n]; }; #endif /* FACTORIAL_H_ */
а это?
Цитата Сообщение от M128K145 Посмотреть сообщение
factorial->PrintFactorial(fact);
M128K145
Эксперт C++
 Аватар для M128K145
8272 / 3491 / 142
Регистрация: 03.07.2009
Сообщений: 10,707
21.11.2010, 15:42     факториал 3000 #18
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// Здесь я немного схалявил, когда переводил со своего кода на java, 
// но в принципе он работает, ошибка состоит в выводе старшего разряда.
// Если он меньше 10 или 100, то выводятся в начале нули
 
void Factorial::PrintFactorial(int factorial)
{
    _Factorial(factorial);
    int i = 0;
    while (mas[i++] == 0);//ищем старший ненулевой десятичный разряд
 
    for (i -= 1; i < n; ++i)
    {
        if (mas[i] >= 100) // если число больше 100
            std::cout<<mas[i]; // то просто его выводим
        else
            if (mas[i] < 10) // если меньше 10
                std::cout<<"00"<<mas[i]; // то перед числом пишем 2 нуля
            else // иначе он меньше 100
                std::cout<<"0"<<mas[i]; // и тогда ставим один ноль перед числом
    }
}
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
02.09.2011, 23:10     факториал 3000 #19
Цитата Сообщение от M128K145 Посмотреть сообщение
Factorial *factorial = new Factorial();
Чем это отличается от
CSS
1
Factorial *factorial = new Factorial;
?
Не могу понять как вы выделаете память.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.09.2011, 08:15     факториал 3000
Еще ссылки по теме:

C++ Факториал
факториал С++ C++
Факториал C++

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

Или воспользуйтесь поиском по форуму:
Евгений М.
1033 / 974 / 53
Регистрация: 28.02.2010
Сообщений: 2,817
Завершенные тесты: 2
03.09.2011, 08:15     факториал 3000 #20
Только написанием.
Yandex
Объявления
03.09.2011, 08:15     факториал 3000
Ответ Создать тему
Опции темы

Текущее время: 08:46. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru