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

Делители - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 26, средняя оценка - 4.92
PANIC666
0 / 0 / 0
Регистрация: 06.08.2009
Сообщений: 19
27.02.2010, 12:59     Делители #1
По заданному натуральному числу N необходимо вычислить количество натуральных чисел, которые являются делителями N! (факториала числа N).

Например, при N=4, N!=4•3•2•1=24. Это число имеет следующие делители: 1, 2, 3, 4, 6, 8, 12, 24. Таким образом, искомое количество составляет 8.

Напишите программу, которая по натуральному N, находит количество делителей его факториала.

Входные данные

Единственная строка содержит одно целое число N (1 ≤ N ≤ 45).

Выходные данные

Единственная строка должна содержать одно целое число – найденное количество делителей числа N!

Пример
ввод 4
вывод 8
Прошу помоч в нахождении делителей при факториале 45 программа очень долго ищет,а нужно уложится в 3 сек.
Буде очень благодарен за помощь

Добавлено через 6 минут
Вот код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
using namespace std;
int main ()
{
long double n,i=1,g;
float c;
long double  f=1;
    cin>>n;
    while(i<=n)
        {f*=i;
        i++;}
        cout<<f<<endl;
             for (i = 1; i <= f; i++) {
                 if (f/i==0) {
                      c++;
                 }
             }
             cin>>c;
            cin>>g;
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.02.2010, 12:59     Делители
Посмотрите здесь:

C++ Простые делители
Взаимно простые делители C++
Делители числа C++
C++ Делители
C++ Задача Делители (divisors)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Yurii_74
paladin
 Аватар для Yurii_74
279 / 179 / 3
Регистрация: 25.02.2009
Сообщений: 592
27.02.2010, 13:48     Делители #2
Ну ведь видно, что задача на разложение n! на степени простых чисел и количество их комбинаций. В лоб она не должна решаться. Олимпиада школьников за какой класс?
И i после некоторой итерации вообще перестанет увеличиваться.
PANIC666
0 / 0 / 0
Регистрация: 06.08.2009
Сообщений: 19
27.02.2010, 13:54  [ТС]     Делители #3
11 Класс.Вот сам факториал прога ищет без проблем но когда я прописываю искать делители то при 45! оно висит долго но потом дает ответ только правильный ли он
Yurii_74
paladin
 Аватар для Yurii_74
279 / 179 / 3
Регистрация: 25.02.2009
Сообщений: 592
27.02.2010, 13:59     Делители #4
Вы представляете себе 45! ? В нем около 12 нулей в конце. А значащих цифр - больше чем вам позволят десятки лонгдаблов суммарно. И лонгдаблы тоже вполне себе дискретны.
PANIC666
0 / 0 / 0
Регистрация: 06.08.2009
Сообщений: 19
27.02.2010, 14:12  [ТС]     Делители #5
Я представляю 45! но я не могу сократить время выполнения программы,тип данных который использую работает находит факториалы даже 500! но вот делители очень долго
Yurii_74
paladin
 Аватар для Yurii_74
279 / 179 / 3
Регистрация: 25.02.2009
Сообщений: 592
27.02.2010, 15:02     Делители #6
Цитата Сообщение от PANIC666 Посмотреть сообщение
тип данных который использую
long double физически не может хранить столько значащих десятичных знаков. Ваш вариант заведомо выдаст неправильный ответ.
Правильная последовательность:
раскладываем каждый множитель на произведение степеней простых чисел (пусть для простых чисел у нас будет массив a[N], где N - номер простого числа (0 для 2, 1 для 3, 2 для 5, 3 для 7 и т. д.) и добавляем к значению степени соотв. простого числа в массиве.
Перемножаем ненулевые значения в массиве, получаем ответ.
Yertugan
0 / 0 / 0
Регистрация: 11.12.2010
Сообщений: 6
11.12.2010, 10:52     Делители #7
ну допустим
5!
1 2 3 4 5 6 7
a[ 3 1 1 ]

и тогда
3*1*1=3
но это не количество делителей 5!
количество делителей у 5! это 16

Добавлено через 1 минуту
ну допустим
5!
1 2 3 4 5 6 7
3 1 1

и тогда
3*1*1=3
но это не количество делителей 5!
количество делителей у 5! это 16
Yertugan
0 / 0 / 0
Регистрация: 11.12.2010
Сообщений: 6
13.12.2010, 18:14     Делители #8
Цитата Сообщение от Yurii_74 Посмотреть сообщение
long double физически не может хранить столько значащих десятичных знаков. Ваш вариант заведомо выдаст неправильный ответ.
Правильная последовательность:
раскладываем каждый множитель на произведение степеней простых чисел (пусть для простых чисел у нас будет массив a[N], где N - номер простого числа (0 для 2, 1 для 3, 2 для 5, 3 для 7 и т. д.) и добавляем к значению степени соотв. простого числа в массиве.
Перемножаем ненулевые значения в массиве, получаем ответ.
А вы не могли бы показать это на примере по подробнее, а то не могу въехать.
Ну скажем на пример 5!
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
13.12.2010, 18:26     Делители #9
Цитата Сообщение от Yertugan Посмотреть сообщение
ну допустим
5!
1 2 3 4 5 6 7
a[ 3 1 1 ]
Тогда так:
5!
2 3 4 5 <- множители числа 5!
Раскладываем каждый множитель на простые числа:
2 - раскладываем на 2
2 - раскладываем на 3
4 - раскладываем на 2*2
5 - раскладываем на 5
Итого простых множителей в числе 5!:
2 3 5 <- простые множители
3 1 1 <- кол-во простых множителей
Теперь чуть-чуть комбинаторки:
3+(3*1+1)+((3+(3*1+1))*1+1)+1=
Считайте и сверяйте ответ.
Yertugan
0 / 0 / 0
Регистрация: 11.12.2010
Сообщений: 6
13.12.2010, 18:36     Делители #10
Теперь чуть-чуть комбинаторки:
3+(3*1+1)+((3+(3*1+1))*1+1)+1=
Считайте и сверяйте ответ.[/QUOTE]

Все понял до этого момента.
Ответ то правильный, а какая формула?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.12.2010, 18:44     Делители
Еще ссылки по теме:

Простые делители заданного числа C++
C++ Программа на C++ найти делители
Делители натурального числа C++

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

Или воспользуйтесь поиском по форуму:
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
13.12.2010, 18:44     Делители #11
Все вот отсюда
Цитата Сообщение от valeriikozlov Посмотреть сообщение
Итого простых множителей в числе 5!:
2 3 5 <- простые множители
3 1 1 <- кол-во простых множителей
Алгоритм такой:
сначало сумма равна 0. Идем по числам из нижней строки.
1. К имеющейся сумме прибавляем эту же сумму, умноженную на очередное число из второй строки. Плюс это же число.
2. Переходим к следующему числу из второй строки и переходим к п.1
Когда все закончится прибавить еще одну 1 (делитель 1).
Yandex
Объявления
13.12.2010, 18:44     Делители
Ответ Создать тему
Опции темы

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