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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.82
Toshik_
1 / 1 / 0
Регистрация: 17.08.2013
Сообщений: 91
#1

Факториал - C++

20.10.2013, 12:38. Просмотров 1474. Ответов 11
Метки нет (Все метки)

Имеется код:
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
#include <iostream>
using namespace std;
long long fact(int a);
 
 
 
int main()
{
    long long int N;
    int k;
    
    cin >> N;
    for(k=1; k<1000000; k++)
        if(fact(k)%N==0){
            cout << k;
            system("pause");
            return 0;
        }
 
}
 
 
long long fact(int a)
{long long int res = 1;
    for (int i = 1; i <= a; ++i)
    {
        res *= i;
    }
 
    return res;
}
После N>96000 программа перестает работать как исправить? Условие:
найти минимальное число k такое, что k! делится на заданное натуральное число N без остатка
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.10.2013, 12:38
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Факториал (C++):

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

С++ Факториал - C++
Надо написать программку на С++ которая вычисляет факториал числа n (факториал обозначается как n!). числа n в диапазоне от 1 до 12...

Факториал - C++
Здравствуйте Всем!!! Меня зовут Наталья. Помогите решить задание на С++: Дано натуральное число n; найти n!. Использовать программу,...

Факториал с++ - C++
1. Ввести n элементов одномерного массива; 2. Вычислить указанное выражение; 3. Вывести на экран значение указанного выражения.

Факториал - C++
Как написать программу для вычисления n факториал

Факториал - C++
Помогите написать программу: Составить функцию, которая вычисляет сумму К слагаемых. В вызывающей функции main() организовать контроль...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Croessmah
Эксперт CЭксперт С++
13237 / 7509 / 847
Регистрация: 27.09.2012
Сообщений: 18,448
Записей в блоге: 3
Завершенные тесты: 1
20.10.2013, 12:43 #2
C++
1
fact(k)
а Вы задумывались чему равен 999999! ?
0
nulpatrol
0 / 0 / 0
Регистрация: 19.10.2013
Сообщений: 16
20.10.2013, 12:51 #3
Я особо не вникал, но мне кажется, что нужно где-то пустить цикл, который будет сокращать k! и N на какие-то числа, иначе будет возникать переполнение
0
Toshik_
1 / 1 / 0
Регистрация: 17.08.2013
Сообщений: 91
20.10.2013, 12:51  [ТС] #4
Цитата Сообщение от Croessmah Посмотреть сообщение
C++
1
fact(k)
а Вы задумывались чему равен 999999! ?
даже пусть будет 300, в чем ошибка?
0
nulpatrol
0 / 0 / 0
Регистрация: 19.10.2013
Сообщений: 16
20.10.2013, 13:03 #5
Поверьте, совсем не 300) 12! = 479001600

P.S. 999999! будет содержать больше миллиарда знаков, даже длинная арифметика вам бы не помогла, программа подвисла бы на пару минут
0
Toshik_
1 / 1 / 0
Регистрация: 17.08.2013
Сообщений: 91
20.10.2013, 13:10  [ТС] #6
Цитата Сообщение от nulpatrol Посмотреть сообщение
Поверьте, совсем не 300) 12! = 479001600

P.S. 999999! будет содержать больше миллиарда знаков, даже длинная арифметика вам бы не помогла, программа подвисла бы на пару минут
я имел в виду 300! ... Так можете рассказать ошибку и помочь её исправить?
0
nulpatrol
0 / 0 / 0
Регистрация: 19.10.2013
Сообщений: 16
20.10.2013, 13:17 #7
300! имеет примерно полторы тысячи знаков. Ни в один числовой тип это не влезет.
Поэтому вам в своей программе не стоит считать факториал. Ваш алгоритм неправильный.
Следует так переделать программу, чтобы факториал не вычислялся. У меня сейчас голова не особо варит, но как вариант - факторизовать N, а потом циклом факторизовать факториал (блин, звучит по дурацки) до тех пор, пока не получится вариант с делением одного на второе.
Например для N=48 имеем 2^4 * 3.
Факторизуем факториал в цикле:
Добавляем 2: 2^1
Добавляем 3: 2^1 * 3^1
Добавляем 4: 2^3 * 3^1
Добавляем 5: 2^3 * 3^1 * 5^1
Добавляем 6: 2^4 * 3^2 * 5^1
Все. То есть 6! делится на 48. 6! = 720. 720 % 48 = 0

Уверен, что можно проще как-то...
0
Toshik_
1 / 1 / 0
Регистрация: 17.08.2013
Сообщений: 91
20.10.2013, 13:28  [ТС] #8
Цитата Сообщение от nulpatrol Посмотреть сообщение
300! имеет примерно полторы тысячи знаков. Ни в один числовой тип это не влезет.
Поэтому вам в своей программе не стоит считать факториал. Ваш алгоритм неправильный.
Следует так переделать программу, чтобы факториал не вычислялся. У меня сейчас голова не особо варит, но как вариант - факторизовать N, а потом циклом факторизовать факториал (блин, звучит по дурацки) до тех пор, пока не получится вариант с делением одного на второе.
Например для N=48 имеем 2^4 * 3.
Факторизуем факториал в цикле:
Добавляем 2: 2^1
Добавляем 3: 2^1 * 3^1
Добавляем 4: 2^3 * 3^1
Добавляем 5: 2^3 * 3^1 * 5^1
Добавляем 6: 2^4 * 3^2 * 5^1
Все. То есть 6! делится на 48. 6! = 720. 720 % 48 = 0

Уверен, что можно проще как-то...
А как на коде это выглядит?
0
nulpatrol
0 / 0 / 0
Регистрация: 19.10.2013
Сообщений: 16
20.10.2013, 13:38 #9
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>
using namespace std;
 
int main() {
    long long int N;
    int k;
 
    cin >> N;
    int i = 2; // Будем перебирать делители
    int fact = 1;
    int j = 2; // И считать факториал
    while (N != 1) {
        while (N % i == 0) {
            if (fact % i == 0) {
                fact /= i;
                N /= i;
            } else {
                fact *= j;
                j++;
            }
        }
        i++;
    }
    cout << j-1;
}
Вроде должно работать, потестируйте
0
Toshik_
1 / 1 / 0
Регистрация: 17.08.2013
Сообщений: 91
20.10.2013, 13:42  [ТС] #10
Цитата Сообщение от nulpatrol Посмотреть сообщение
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>
using namespace std;
 
int main() {
    long long int N;
    int k;
 
    cin >> N;
    int i = 2; // Будем перебирать делители
    int fact = 1;
    int j = 2; // И считать факториал
    while (N != 1) {
        while (N % i == 0) {
            if (fact % i == 0) {
                fact /= i;
                N /= i;
            } else {
                fact *= j;
                j++;
            }
        }
        i++;
    }
    cout << j-1;
}
Вроде должно работать, потестируйте
При N=17, k=26 хотя должно быть равно 17
0
nulpatrol
0 / 0 / 0
Регистрация: 19.10.2013
Сообщений: 16
20.10.2013, 13:53 #11
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>
using namespace std;
 
int main() {
    long long int N;
    int k;
 
    cin >> N;
    int i = 2; // Будем перебирать делители
    int fact = 1;
    int j = 2; // И считать факториал
    while (N != 1) {
        while (N % i == 0) {
            if (fact % i == 0) {
                N /= i;
                fact /= i;
            } else {
                fact = j;
                j++;
            }
        }
        i++;
    }
    cout << j-1;
}
0
Toshik_
1 / 1 / 0
Регистрация: 17.08.2013
Сообщений: 91
20.10.2013, 14:03  [ТС] #12
Цитата Сообщение от nulpatrol Посмотреть сообщение
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>
using namespace std;
 
int main() {
    long long int N;
    int k;
 
    cin >> N;
    int i = 2; // Будем перебирать делители
    int fact = 1;
    int j = 2; // И считать факториал
    while (N != 1) {
        while (N % i == 0) {
            if (fact % i == 0) {
                N /= i;
                fact /= i;
            } else {
                fact = j;
                j++;
            }
        }
        i++;
    }
    cout << j-1;
}
теперь при N=36288; k=21 а по идее должно быть 9, а прошлый раз наоборот этот вариант правильный был
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.10.2013, 14:03
Привет! Вот еще темы с ответами:

факториал - C++
найти число нулей в конце факториала числа N по основанию каждого множителя K (1&lt;=N&lt;=1000000000, 2&lt;=K&lt;=1000) #include &lt;iostream&gt; ...

Факториал - C++
Пожалуйсто, помогите написать прогу на Си, которая вичисляла бы 100! (факториал) выводя всё на экран!

Факториал (n-1)! - C++
Помогите, пожалуйста, написать факториал (n-1)! очень надо

Факториал - C++
Дано натуральное число n; найти n!. Использовать программу, включающую рекурсивную процедуру вычисления n!


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
20.10.2013, 14:03
Ответ Создать тему
Опции темы

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