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

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

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

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

20.10.2013, 12:38. Просмотров 1429. Ответов 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 без остатка
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.10.2013, 12:38     Факториал
Посмотрите здесь:

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

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

P.S. 999999! будет содержать больше миллиарда знаков, даже длинная арифметика вам бы не помогла, программа подвисла бы на пару минут
я имел в виду 300! ... Так можете рассказать ошибку и помочь её исправить?
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

Уверен, что можно проще как-то...
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

Уверен, что можно проще как-то...
А как на коде это выглядит?
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;
}
Вроде должно работать, потестируйте
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
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;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.10.2013, 14:03     Факториал
Еще ссылки по теме:

C++ Факториал Си
факториал С++ C++
Факториал C++
C++ Факториал
Факториал с++ C++

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

Или воспользуйтесь поиском по форуму:
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, а прошлый раз наоборот этот вариант правильный был
Yandex
Объявления
20.10.2013, 14:03     Факториал
Ответ Создать тему
Опции темы

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