0 / 0 / 0
Регистрация: 10.04.2016
Сообщений: 6
1

Расчет факториала от потенциально бесконечного числа С++

10.04.2016, 09:13. Показов 1196. Ответов 6
Метки нет (Все метки)

Здравствуйте.
Сравнительно недавно встала задача написать программу которая высчитывает факториал не стандартным методом, а конкретно счетом с использованием строк, для нахождения факториала от миллиона и т.п. Вот что примерно вышло, но оно не работает. Если не сложно, не мог бы кто нибудь поправить?
Или указать в каком направлении решать задачу.
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
#include <iostream>
#include <cstring>
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
using namespace std;
int MassSize = 1, sdvig = 1, mnoj, mnoj1, mnoj2, proiz,MnojMassSize=10;
bool b = false;
 
int main() {
    int *Mass = new int[1];
    int *MnojMass = new int[10];
    memset(MnojMass,0,MnojMassSize*4);
    int *Result = new int[1];
    //Result = new int[1];
    Result[0] = 1;
    cout << "Write your number" << endl;
    cin >> mnoj;
 
    for (int z = 1; z <= mnoj; z++) {
        MnojMass[0] = z;
        for (int j = 0; j < 10; j++) {
            if (MnojMass[j] > 9) {
                MnojMass[j + 1] = MnojMass[j] / 10;
                MnojMass[j] = MnojMass[j] % 10;
                if (MnojMass[sdvig] == 1)
                    sdvig++;
 
            }
        }
        MassSize += sdvig;
        delete[] Mass;
        Mass = new int[MassSize];
        memset(Mass, 0, MassSize*4);
 
        memcpy(Mass, Result, MassSize*4);
 
        //delete[] Result;
        Result = new int[MassSize];
        memset(Result, 0, MassSize*4);
 
        for (int i = 0, i4 = 0; i < sdvig; i++, i4++) {
            mnoj1 = MnojMass[i];
            for (int i2 = 0, i3 = i4; i2 < MassSize; i2++, i3++) {
                mnoj2 = Mass[i2];
                proiz = mnoj1 * mnoj2;
                if (Result[i3] < 0 && Result[i3] > 10000)
                    Result[i3] = proiz;
                else
                    Result[i3] += proiz;
            }
        }
        for (int q = 0; q < MassSize; q++)
            if (Result[q] > 9) {
                Result[q + 1] += Result[q] / 10;
                Result[q] = Result[q] % 10;
            }
        if (Mass[MassSize - 3] == 0)
            MassSize--;
 
    }
 
    // memset(Result,0,MassSize*4);
    // Result=new int[MassSize];
 
    for (int i = MassSize - 1; i >= 0; i--)
        if (Result[i] >= 0)
            cout << Result[i];
    // for (int i = 0; i<MassSize; i++)
    // cout << Result[i];
    getch();
    return 0;
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.04.2016, 09:13
Ответы с готовыми решениями:

Расчёт факториала натурального числа
Составить программу для расчёта факториала натурального числа n(факториал числа n равен 1,2...).

Расчет факториала натурального числа n
Помогите, пожалуйста.. Составить программу для расчета факториала натурального числа n (факториал...

Расчет факториала для произвольного числа n<10
Составьте программу расчета факториала для произвольного числа n&lt;10 Срочно нужно решение в Java

Расчет факториала натурального числа n по трем условиям
Составить программу для расчета факториала натурального числа n по трем условиям ?

6
115 / 105 / 51
Регистрация: 29.03.2016
Сообщений: 480
10.04.2016, 10:32 2
делал я такое на паскале
для этого лучше всего создать динамическую структуру (двунаправленный список) в которой будут храниться символы (хотя для факторила и string подойдет, но если нужно для поистине большого числа, то лучше структура). написать функцию для заполнения этой структуры с клавиатуры (или какой способ ввода у вас на уме) и функцию для умножения структуры на структуру. на ваше счастье не придется делить (функция получилась бы в разы больше).
умножение производим по принципу в столбик (как во втором классе на бумажке)

Добавлено через 2 минуты
если желаете, могу выдать свой калькулятор для больших чисел, реализованный как раз по этому принципу (с поддержкой действительных чисел). Там есть сложение, вычитание, умножение и деление. общий размер 1548 строк.

Добавлено через 11 минут
у меня структура небольшая:
C++
1
2
3
4
5
6
struct list
{
    char ch;        // значение хранящееся в элементе
    list *pred;     // предыдущий элемент
    list *post;     // следующий элемент
};
и эту структуру обслуживает менеджер:
C++
1
2
3
4
5
6
7
8
struct box
{
    list *current;
    list *first;
    list *last;
    char znak;
    list *point;   // указатель на ячейку, после которой должна стоять точка
};
Добавлено через 49 минут
кстати, вот код на паскале:
Pascal
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
77
78
79
80
const
n3=60000;
var
m1,m2,mas: array of byte;
m3: array [1..n3] of byte;
a,am,ad,ch,b: byte;
i,j,k,n1,n2,n: word;
st: string[50];
flag,flan: boolean;
begin
write('--> ');
readln(st);
  for i:=1 to 50 do
  if ord(st[i])<>0 then n:=i+1;
  setlength(mas,n);
  b:=0;
  for i:=50 downto 1 do
  if ord(st[i])<>0 then
   begin
   b:=b+1;
   ch:=ord(st[i])-48;
   if i<=n then mas[b]:=ch;
   end;
n1:=2;
n2:=2;
setlength(m1,n1);
setlength(m2,n2);
m1[i]:=2;
m2[i]:=1;
for i:=1 to n3-1 do m3[i]:=0;
repeat
flag:=true;
for i:=1 to n1-1 do 
 if m1[i]<>9 then flag:=false;
 if flag=true then n1:=n1+1;
 setlength(m1,n1);
for i:=1 to n1-1 do
 if m1[i]=10 then
 begin
 m1[i]:=m1[i] mod 10; 
 m1[i+1]:=m1[i+1]+1;
 end;
//for i:=n1-1 downto 1 do write(m1[i]);
//writeln;
for j:=1 to n2-1 do
 for i:=1 to n1-1 do
  begin
  k:=i+j;
  a:=m2[j]*m1[i];
  am:=a mod 10;
  m3[k-1]:=m3[k-1]+am;
  ad:=a div 10;
  m3[k]:=m3[k]+ad;
  if m3[k-1]>9 then 
   begin
   ad:=m3[k-1] div 10;
   m3[k]:=m3[k]+ad;
   am:=m3[k-1] mod 10; 
   m3[k-1]:=am;
   end;
  end;
i:=60001;
repeat
i:=i-1;
if m3[i]<>0 then n2:=i+1;
until m3[i]<>0;
setlength(m2,n2);
for i:=1 to n2-1 do m2[i]:=m3[i];
for i:=1 to n3-1 do m3[i]:=0;
if n=n1 then
 begin
 flan:=true;
  for i:=1 to n-1 do
   if mas[i]<>m1[i] then flan:=false;
 end;
m1[1]:=m1[1]+1;
until flan=true;
for i:= n2-1 downto 1 do write(m2[i]);
readln;
end.
0
0 / 0 / 0
Регистрация: 10.04.2016
Сообщений: 6
11.04.2016, 07:25  [ТС] 3
Было бы очень круто, если можно посмотреть на Ваш калькулятор
0
115 / 105 / 51
Регистрация: 29.03.2016
Сообщений: 480
11.04.2016, 08:19 4
RobbyWhite, смотрите (выкладываю файл)
0
115 / 105 / 51
Регистрация: 29.03.2016
Сообщений: 480
11.04.2016, 08:26 5
Лучший ответ Сообщение было отмечено RobbyWhite как решение

Решение

в трех файлах выложил (одним не дал загрузить)
Вложения
Тип файла: txt calc_part1.txt (15.5 Кб, 3 просмотров)
Тип файла: txt calc_part2.txt (19.2 Кб, 7 просмотров)
Тип файла: txt calc_part3.txt (2.8 Кб, 2 просмотров)
1
115 / 105 / 51
Регистрация: 29.03.2016
Сообщений: 480
11.04.2016, 08:28 6
функция деления почти целиком calc_part2.txt занимает
0
0 / 0 / 0
Регистрация: 10.04.2016
Сообщений: 6
14.04.2016, 20:52  [ТС] 7
Спасибо, интересная реализация, только я в ней немного запутался, не подскажите как реализовать таким образом факториал? И обязательно ли использование структур, ведь без них код выходит короче?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.04.2016, 20:52
Помогаю со студенческими работами здесь

Расчёт факториала
Здравствуйте. Я написал очень простенькую программку, которая рассчитывает факториал: static...

Расчет факториала
Создайте внешний отчет &quot;Факториал&quot;, который рассчитывает значение факториала для заданного числа...

Расчет факториала
Помогите найти ошибку! Задание: ((2*5!) + (3+8!)) / (6!+4!) &lt;html&gt; &lt;head&gt; &lt;script...

Расчёт факториала
Здравствуйте! Столкнулся вот с таким заданием, снизу прикрепил. (Задание на C#) Преподаватель...

Расчёт факториала за формулой
Здравствуйте. Как реализовать данную формулу на C#? Знаю как найти факториал но как сделать это...

Расчёт биномиального коэффициента без факториала
Столкнулся с проблемой. Мне надо вычислить биномиальные коэффициенты довольно больших чисел,...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru