Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
RobbyWhite
0 / 0 / 0
Регистрация: 10.04.2016
Сообщений: 3
#1

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

10.04.2016, 09:13. Просмотров 247. Ответов 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)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.04.2016, 09:13
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Расчет факториала от потенциально бесконечного числа С++ (C++):

Расчет функции в виде бесконечного ряда - C++
Помогите пожалуйста, не получается написать рабочую прогу. Задание было такое: составить программу вычисления F(x) в виде бесконечного ряда...

Вычисление факториала числа - C++
Маленькая программа вычисляет факториал числа, введенного пользователем, по формуле N! = N * (N – 1)!, где 0 != 1, и выводит его на экран. ...

Вычисление факториала числа - C++
Написать программу, которая вычисляет факториал введенного с клавиатуры числа. (Факториалом числа n называется произведение целых чисел от...

Вычисление факториала числа N - C++
Что надо написать в пропущенной строке? setlocale(LC_ALL, &quot;Russian&quot;); int N; int P=1; cout&lt;&lt;&quot;Input N: &quot;; cin&gt;&gt;N; ...

Вычисление факториала числа (Pascal -> C++) - C++
Дано целое число N &gt; 0. Вывести произведение 1•2•...•N. Чтобы избежать целочисленного переполнения, вычислять это произведение с помощью...

Вычисление факториала 20-битного числа - C++
Здравствуйте. Дано 20-битное беззнаковое целое число. Нужно узнать количество знаков и количество нулей его факториала в N системе...

6
Serg_o_Grey
76 / 76 / 27
Регистрация: 29.03.2016
Сообщений: 349
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
RobbyWhite
0 / 0 / 0
Регистрация: 10.04.2016
Сообщений: 3
11.04.2016, 07:25  [ТС] #3
Было бы очень круто, если можно посмотреть на Ваш калькулятор
0
Serg_o_Grey
76 / 76 / 27
Регистрация: 29.03.2016
Сообщений: 349
11.04.2016, 08:19 #4
RobbyWhite, смотрите (выкладываю файл)
0
Serg_o_Grey
76 / 76 / 27
Регистрация: 29.03.2016
Сообщений: 349
11.04.2016, 08:26 #5
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
в трех файлах выложил (одним не дал загрузить)
1
Вложения
Тип файла: txt calc_part1.txt (15.5 Кб, 2 просмотров)
Тип файла: txt calc_part2.txt (19.2 Кб, 4 просмотров)
Тип файла: txt calc_part3.txt (2.8 Кб, 1 просмотров)
Serg_o_Grey
76 / 76 / 27
Регистрация: 29.03.2016
Сообщений: 349
11.04.2016, 08:28 #6
функция деления почти целиком calc_part2.txt занимает
0
RobbyWhite
0 / 0 / 0
Регистрация: 10.04.2016
Сообщений: 3
14.04.2016, 20:52  [ТС] #7
Спасибо, интересная реализация, только я в ней немного запутался, не подскажите как реализовать таким образом факториал? И обязательно ли использование структур, ведь без них код выходит короче?
0
14.04.2016, 20:52
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.04.2016, 20:52
Привет! Вот еще темы с ответами:

Вычисление факториала большого числа - C++
написать программу, которая вычисляла бы факториал заданного большого числа, например 500, и результат вычислений с точностью до единицы...

Описать рекурсивные функции вычисляющие значения факториала и двойного факториала - C++
Написать блок схему и программу согласно заданию. Описать рекурсивные функции Fact(n) и Fact2(N) вещественного типа, вычисляющие значения...

Реальзовать Функцию вычисления факториала числа - C++
Функция вычисления факториала числа..

программа вычисления факториала любого числа - C++
помогите написать программу на C++!!! надо написать программу, которая вычислит факториал любого числа. данные читает из файла и...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru