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

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

07.02.2017, 03:16. Показов 4439. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru