Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/21: Рейтинг темы: голосов - 21, средняя оценка - 4.67
1 / 1 / 0
Регистрация: 06.01.2017
Сообщений: 21

Умножить факториал сам на себя 1000000 раз

07.02.2017, 03:16. Показов 4377. Ответов 31

Студворк — интернет-сервис помощи студентам
Нужно умножить факториал сам на себя 1 000 000 раз. Попытался сделать 2 файла, где 1й это вычисление факториала к примеру 5 а второй возвести это все в степень, но выбило ошибку: main функция перегружена. Может есть очень простой способ чтоб это сделать

Вот вычисление факториала 5

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include "stdafx.h"
#include <stdio.h>
#include <iostream>
 
long long Factor(int n)
{
    if ((n == 1) || (n == 0))
        return 1;
    else
        return (n * Factor(n - 1));
}
 
int main(int argc, char * argv[])
{
    std::cout << Factor(5) << std::endl;
    return 0;
}
Попытка возмести в степень
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
#include <iostream>
#include "stdafx.h"
#include "Cons.h"
#include <iostream>
 
using namespace std;
 
int main(int Factor)
{
    cout << "Enter a number and degree: ";
 
    int degree;
    cin >> Factor >> degree;
 
    double result = 1;
    int i = 0;
    while (i < degree)
    {
        result *= Factor;
        i++;
    }
    cout << "\nresult: " << result;
 
    system("PAUSE");
    return 0;
Добавлено через 40 минут
Попытался что то сделать
Получилось так:
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
#include "stdafx.h"
#include <stdio.h>
#include <iostream>
#include <math.h>
#include <conio.h>
 
using namespace std;
long long Factor(int n)
{
    if ((n == 1) || (n == 0))
        return 1;
    else
        return (n * Factor(n - 1));
}
 
int main(int argc, char * argv[])
{
    std::cout << Factor(5) << std::endl;
 
    return 0;
}
 
int w() {
    setlocale(LC_ALL, "RUS");
    long double a, n, rezult = 1, i;
    cout << Factor;
    cin >> a;
    cout << endl << "Введите стень числа: ";
    cin >> n;
    for (i = 0; i<n; i++)
        rezult *= a;
    
    printf(" %.0Lf", a);
 
    return 0;
}
Но не выводит на экран не знаю почему, возведение в степень надо через цикл без использования pow
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.02.2017, 03:16
Ответы с готовыми решениями:

Как умножить массив сам на себя?
int a= new int ... for(int i=0; i&lt;a.lenght; i++){ sum=a*a; &lt;--- как перемножить масив с i+1 чтоб не выдавало...

Как создать ZIP-архив, который распаковывается сам в себя много раз?
Как можно сделать на python ZIP-архив, который распаковывается сам в себя много раз? Спасибо.

Как сделать так, чтобы bat-файл копировал сам себя в папку N-ное количество раз?
Добрый день! Как сделать так чтобы bat файл копировал сам себя в папку N колличество раз?

31
1719 / 568 / 187
Регистрация: 12.03.2016
Сообщений: 2,169
07.02.2017, 08:54
Цитата Сообщение от Gaselka Посмотреть сообщение
Нужно умножить факториал сам на себя 1 000 000 раз.
Эка Вы замахнулись.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include "stdafx.h"
#include <iostream>
 
int main()
{
    setlocale(0, "");
    int N,N1,F = 1;
    std::cout << "Введите N для вычисления факториала > 0 = "; std::cin >> N;
    std::cout << "Введите степень факториала = "; std::cin >> N1;
    for (int i = 1; i <= N; i++)
        F *= i;
    std::cout << F << std::endl;
 
        double F2 = 1;
        for (int i = 1; i <= N1; i++)
            F2 *= F;
        std::cout << F2 << std::endl;
    system("pause");
    return 0;
}
Подправите как Вам надо.
0
1 / 1 / 0
Регистрация: 06.01.2017
Сообщений: 21
07.02.2017, 13:51  [ТС]
при возведении в степень больше 100 пишет что равно inf т.е. бесконечность, можно ли как то отобразить этот ответ?
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
07.02.2017, 14:58
Цитата Сообщение от Gaselka Посмотреть сообщение
можно ли как то отобразить этот ответ?
Максимальный размер типа в стандарте С++ - 64 байта, его максимальное значение https://www.cyberforum.ru/cgi-bin/latex.cgi?{2}^{64}-1.
Соответственно. записать факториал даже двойки в сотой степени (https://www.cyberforum.ru/cgi-bin/latex.cgi?{2}^{100}) не выйдет.
Вам нужна длинная арифметика.
0
1 / 1 / 0
Регистрация: 06.01.2017
Сообщений: 21
07.02.2017, 16:29  [ТС]
Я ошибся, извините, надо через цикл посчитать факториал 1000000 раз, т.е. как в паскале через repeat
Пробовал через For, но когда присваиваю счетчику значение 0 то в выводе при факториале 4 выводит что он равен 1
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <stdio.h>
 
int main()
{
    setlocale(0, "");
    int N, a, F = 1;
    std::cout << "Введите N для вычисления факториала > 0 = "; 
    std::cin >> N;
    for (a = 0; a == 1000; a++) {
        
        for (int i = 1; i <= N; i++)
            F *= i;
    }
    std::cout << F << std::endl;
 
    system("pause");
    return 0;
}
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
07.02.2017, 17:29
Цитата Сообщение от Gaselka Посмотреть сообщение
надо через цикл посчитать факториал 1000000 раз
Один и тот же? Зачем?
Тем более, это можно сделать на этапе компиляции и в итоге вызов функции подсчёта будет заменён на константу.

Добавлено через 55 секунд
Цитата Сообщение от Gaselka Посмотреть сообщение
a == 1000
пока a равно 1000, при начальном условии a = 0 этот цикл будет выполнен 0 раз.
Наверное, вы хотели написать a < 1000 или a != 1000
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
07.02.2017, 17:32
Цитата Сообщение от Gaselka Посмотреть сообщение
посчитать факториал 1000000 раз,
От одного и того же числа?
Цитата Сообщение от Gaselka Посмотреть сообщение
C++
1
2
3
4
for (a = 0; a == 1000; a++) {
for (int i = 1; i <= N; i++)
* * * * * * F *= i;
* * }
Цикл не выполнится ни разу. F остается тем же, что ты ему присвоил (1)
Смотри. a = 0;
Далее проверка, равен ли a 1000000 ? Но он же равен Нулю! Происходит выход из цикла.
0
1 / 1 / 0
Регистрация: 06.01.2017
Сообщений: 21
07.02.2017, 20:11  [ТС]
я понял спасибо, вечерком разберу код и сюда выложу что получилось

Добавлено через 2 часа 22 минуты
Цитата Сообщение от Байт Посмотреть сообщение
Далее проверка, равен ли a 1000000
вот что получилось у меня
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
#include "stdafx.h"
#include <iostream>
#include <cstring>
#include "time.h"
 
using namespace std;
 
 
 
long F(int N)
{
    long double q = 1;
    for (int j = 1; j <= N; j++)
    {
        q *= j;
    }
    return q;
}
    
 
 
int main()
{
    setlocale(0, "");
 
    while (true)
    {
 
        int c = clock();
        cout << "Введите число: ";
        int N;
        cin >> N;
        cout << endl;
 
        long q = 1;
        for (int i = 0; i <= 10000000; i++)
        {
            q = F(N);
        }
        cout << "Время: " << clock() - c << endl;
        cout << "Факториал = " << q << endl;
        system("pause");
        return 0;
    }
}
только одна проблема при вычислении к примеру факториала числа 999 выдает значение -2147483648.
На сколько я понимаю так быть не должно
0
1719 / 568 / 187
Регистрация: 12.03.2016
Сообщений: 2,169
07.02.2017, 21:20
У Вас и при 100 не вычисляет.

Добавлено через 43 минуты
Gaselka, и еще почитайте о нижней и верхней границе диапазона данных различного типа и Вы опять придете к посту 4 многоуважаемого MrGluck,
1
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
07.02.2017, 22:22
Цитата Сообщение от Gaselka Посмотреть сообщение
при вычислении к примеру факториала числа 999 выдает значение -2147483648.
А вы прикиньте (приблизительно) сколько цифр у 1000! И куда же малюсенькому long double такую прорву вместить?!
Ничего не говоря про согласование типов. Ваш F считает long double. А возвращает long.
Но вообще-то задачка поучительная. На столкновение Пижона с Бесконечностью.
0
1 / 1 / 0
Регистрация: 06.01.2017
Сообщений: 21
07.02.2017, 23:00  [ТС]
Цитата Сообщение от мановар Посмотреть сообщение
Вы опять придете к посту 4
Я понял, спасибо, требования к факториалу нет, так что изучение длинной арифметики отложу как нибудь на потом

Добавлено через 3 минуты
Цитата Сообщение от Байт Посмотреть сообщение
Ваш F считает long double. А возвращает long.
а как надо? подскажите
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
07.02.2017, 23:10
Цитата Сообщение от Gaselka Посмотреть сообщение
а как надо? подскажите
Даже стремно как-то тут подсказывать. Закон-то прост. Что считаешь - то и выводишь. Но если ты хочешь, чтоб я считал тебя совсем несмыслемышем ...
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
long double F(int N)
{
    long double q = 1;
    for (int j = 1; j <= N; j++)
    {
        q *= j;
    }
    return q;
}
0
1 / 1 / 0
Регистрация: 06.01.2017
Сообщений: 21
07.02.2017, 23:14  [ТС]
Цитата Сообщение от Gaselka Посмотреть сообщение
а как надо? подскажите
просто ради интереса сделал тип unsigned long long и получилось вычислить 65!
0
08.02.2017, 00:05

Не по теме:

Цитата Сообщение от Gaselka Посмотреть сообщение
сделал тип unsigned long long и получилось вычислить 65!
Шура, пилите дальше, они внутри золотые:D

0
192 / 166 / 82
Регистрация: 01.07.2016
Сообщений: 943
08.02.2017, 10:23
Вот "длинная арифметика" возведения числа в степень:
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
#include <bits/stdc++.h>
 
using namespace std;
 
int main()
{
    ifstream fin("input.txt");
    ofstream fout("output.txt");
    int n;
    fin>>n;
    if(n==0){
        fout<<"1";
        return 0;
    }
    int maxsize=10000;
    int a[maxsize],c=0;
    for(int i=0;i<10000;++i)a[i]=0;
    a[9999]=1;
    int k;
    for(int i=1;i<=n;++i){
 
        for(int j=9999;j>=0;j--){
        a[j]=a[j]*2+c;
        c=a[j]/10;
        a[j]=a[j]%10;
        }
 
        if(c>0){
            for(int l=0;l<10000;++l){
        if(a[l]!=0){
            break;
            k=l;
        }
    }
        while(c>0){
        k--;
        a[k]=c%10;
        c=c/10;
    }
    }
 
    }
    int i,j;
    for(i=0;i<10000;++i){
        if(a[i]!=0)break;
    }
    for(j=i;j<10000;++j){
        fout<<a[j];
    }
}
Вот "длинная арифметика" вычисления факториала:
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
#include <bits/stdc++.h>
 
using namespace std;
 
int main()
{
    ifstream fin("input.txt");
    ofstream fout("output.txt");
    int n;
    fin>>n;
    if(n==0){
        fout<<"1";
        return 0;
    }
    int maxsize=10000;
    int a[maxsize],c=0;
    for(int i=0;i<10000;++i)a[i]=0;
    a[9999]=1;
    int k;
    for(int i=1;i<=n;++i){
 
        for(int j=9999;j>=0;j--){
        a[j]=a[j]*i+c;
        c=a[j]/10;
        a[j]=a[j]%10;
        }
 
        if(c>0){
            for(int l=0;l<10000;++l){
        if(a[l]!=0){
            break;
            k=l;
        }
    }
        while(c>0){
        k--;
        a[k]=c%10;
        c=c/10;
    }
    }
 
    }
    int i,j;
    for(i=0;i<10000;++i){
        if(a[i]!=0)break;
    }
    for(j=i;j<10000;++j){
        fout<<a[j];
    }
}
Просто засуньте всё это в функции и при надобности какой-либо из них можете просто их вызывать.
Жду благодарность от автора темы, я пока писал всё это глаза на лоб вылезли
2
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
08.02.2017, 11:21
Цитата Сообщение от no swear Посмотреть сообщение
int maxsize=10000;
1000000! по грубой нижней оценке содержит не меньше 450000 (полмиллиона) знаков
0
192 / 166 / 82
Регистрация: 01.07.2016
Сообщений: 943
08.02.2017, 13:39
Ну тогда я без понятия как можно решить задачу для 1'000'000! В массив, конечно же, такое число не влезет. Что можете посоветовать, может натталкнёте на идею какую-нибудь
0
1378 / 522 / 72
Регистрация: 21.07.2015
Сообщений: 1,308
08.02.2017, 14:04
Цитата Сообщение от no swear Посмотреть сообщение
В массив, конечно же, такое число не влезет.
Ну миллион (знаков) еще влезет. А если использовать правильную длинную арифметику с использованием всех битов элемента массива (а не log2(10) для хранения десятичного разряда), то и того меньше.
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
08.02.2017, 14:24
Цитата Сообщение от shmkv Посмотреть сообщение
если использовать правильную длинную арифметику
Я обычно для длинной арифметики использую 32768-ичкую (или 65536-ичную) систему счисления. На каждый разрядик - short int (2 байта). А умножение разрядов можно производить в long (4 байта)
Правда потом сложновато переводить в десятичную (я перевожу в 1000-ичную), но это проблема разрешима.
Цитата Сообщение от no swear Посмотреть сообщение
В массив, конечно же, такое число не влезет.
Тогда придется в файлик писать. Для скорости всякую буферизацию придумывать. В общем, если заниматься длинной арифметикой всерьез - дел невпроворот. И при этом всегда надо помнить, что найдется число, которое не влезет и в файловое представление, будь у тебя хоть ТерраБайтовые Диски
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
08.02.2017, 14:26
Лучший ответ Сообщение было отмечено gru74ik как решение

Решение

Если не хочется изобретать велосипед, то можно использовать boost.
http://www.boost.org/doc/libs/... p_int.html
Он достаточно удобен.
Цитата Сообщение от Example:
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
#include <boost/multiprecision/cpp_int.hpp>
#include <iostream>
 
int main()
{
   using namespace boost::multiprecision;
 
   int128_t v = 1;
 
   // Do some fixed precision arithmetic:
   for(unsigned i = 1; i <= 20; ++i)
      v *= i;
 
   std::cout << v << std::endl; // prints 20!
 
   // Repeat at arbitrary precision:
   cpp_int u = 1;
   for(unsigned i = 1; i <= 100; ++i)
      u *= i;
 
   std::cout << u << std::endl; // prints 100!
 
   return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.02.2017, 14:26
Помогаю со студенческими работами здесь

Выписаны все натуральные числа от 1 до 1000000. Сколько раз выписана цифра 1
Выписаны все натуральные числа от 1 до 1000000. Сколько раз выписана цифра 1.

Умножить матрицу на себя транспонированую
Буду краток: необходимо Умножить матрицу на себя транспонированую!!!(без хранения транспонированной) Как в вышмате это сделать я понимаю, а...

Умножить матрицу на себя транспонированую
Буду краток: необходимо Умножить матрицу на себя транспонированую!!!(без хранения транспонированной) Как в вышмате это сделать я понимаю, а...

Какова вероятность, что за 1000000 вращений все 37 секторов выпадут в порядке возрастания хотя бы 1 раз?
Есть рулетка, разделенная на 37 секторов от 0 до 36 с равновероятным выпадением. Вращаем её 1000000 раз, какова вероятность, что за 1000000...

Как умножить матрицу на саму себя
Как умножить матрицу MxN на саму себя, то есть возвести ее во вторую степень? Помогите пожалуйста написать шаблон в c#


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru