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

Вывести факториал числа - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.65
4atty
 Аватар для 4atty
45 / 45 / 1
Регистрация: 09.06.2011
Сообщений: 117
04.07.2011, 14:23     Вывести факториал числа #1
Здраствуйте.
Пользователь вводит любое число, а программа должна вывести факториал этого числа.

Я думал сделать єто с помощью if но не получилось

Помогите плз
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.07.2011, 14:23     Вывести факториал числа
Посмотрите здесь:

C++ найти факториал числа...
C++ Выдать факториал числа
C++ Факториал числа
Факториал числа C++
C++ факториал числа
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
04.07.2011, 15:21     Вывести факториал числа #2
C++
1
2
3
4
5
6
7
8
#include <iostream>
unsigned long long fact( int x ){ return x < 2 ? 1 : x * fact(x - 1); }
int main(){
    int N;
    std::cin >> N;
    std::cout << fact(N) << std::endl;
    return 0;
}
А вообще, ваша проблема далекооо не уникальна, могли бы и поиском воспользоватся.
4atty
 Аватар для 4atty
45 / 45 / 1
Регистрация: 09.06.2011
Сообщений: 117
04.07.2011, 15:27  [ТС]     Вывести факториал числа #3
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Сэнкс)
AzaKendler
 Аватар для AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
04.07.2011, 15:36     Вывести факториал числа #4
diagon, а как насчет факториал 1000.
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
04.07.2011, 15:45     Вывести факториал числа #5
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от AzaKendler Посмотреть сообщение
diagon, а как насчет факториал 1000.
Не вопрос
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
#include <stdio.h>
#include <iostream>
#include <sstream>
#include <vector>
#define base 1000000000
void writelong(std::vector<int> vec){
    printf ("%d", vec.empty() ? 0 : vec.back());
    for (int i=(int)vec.size()-2; i>=0; --i)
        printf ("%09d", vec[i]);
}
std::vector<int> smult(std::vector<int> a, int b){
    int carry = 0;
    for (size_t i=0; i<a.size() || carry; ++i) {
        if (i == a.size())
            a.push_back (0);
        long long cur = carry + a[i] * 1ll * b;
        a[i] = int (cur % base);
        carry = int (cur / base);
    }
    while (a.size() > 1 && a.back() == 0)
        a.pop_back();
    return a;
}
int main(){
    int b;
    std::cin >> b;
    std::vector<int> a(1,1);
    for (int i = 1; i <= b; i++)
        a=smult(a,i);
    writelong(a);
    std::cout << std::endl;
    return 0;
}
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
04.07.2011, 15:46     Вывести факториал числа #6
AzaKendler, да запросто!
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <gmpxx.h>
 
int main()
{
    int a = 1000;
    int b = a+1;
    mpz_class f("1");
 
    while (--b > 1)
        f *= b;
 
    std::cout << "fact(" << a << ") = " << f << std::endl;
 
    return 0;
}
AzaKendler
 Аватар для AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
04.07.2011, 16:07     Вывести факториал числа #7
diagon, клево. вроде считает. и даже большие величины. а я то выполняя сие задание такое чудовище сгородил, оно еле ворочалось, но тоже считало любые величины.

Добавлено через 4 минуты
grizlik78, <gmpxx.h> это файлец откуда? чтото студия говорит нет у нее такого
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
04.07.2011, 16:08     Вывести факториал числа #8
AzaKendler, ну да, стандартной поддержки нет. Это The GNU Multiple Precision Arithmetic Library
KING1994
-68 / 6 / 0
Регистрация: 18.07.2011
Сообщений: 77
05.09.2011, 21:16     Вывести факториал числа #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
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
51
52
53
54
55
56
57
58
59
// fact1.cpp: определяет точку входа для консольного приложения.
//
#include "stdafx.h"
#include <iostream>
#include<conio.h>
using namespace std;
long int vvid,m[1000000],n[1000000],h[1000000],q[1000000],sum,sum1,ost,ost1;int i,j=0,x,y,z,k=0,v,L,b,K,k1,w,c=0,r=0;
int main()
{
    cin>>vvid;
    m[999999]=1;n[999999]=1;j=999999;z=999999;h[999999]=0;b=j;
for(i=2,y=j;i<=vvid;i++)   
{
    y=j;z=j;v=j;L=j;b=j;w=j;K=j;
    if(i<=10)
       {
        do{m[z]*=i;z--;}while(z>=0);
            do 
            {
            if(m[y]>=10)
            {ost=m[y]%10;m[y]-=ost;m[y]/=10;m[y-1]+=m[y];m[y]=ost;}y--;
            }while(y>=0);
       }
     else if(i>=11)
         { 
            sum=i;
             sum=i;ost1=sum%10;sum1=(sum-ost1)/10;k=0;r=0;
            do{n[z]=m[z];n[z]*=ost1;z--;}while(z>=0);
            do 
            {
            if(n[y]>=10)
            {ost=n[y]%10;n[y]-=ost;n[y]/=10;n[y-1]+=n[y];n[y]=ost;}y--;
            }while(y>=0);
            do{h[b-1]=m[b];h[b]*=sum1;b--;}while(b>=0);
            do 
            {
            if(h[v]>=10)
            {ost=h[v]%10;h[v]-=ost;h[v]/=10;h[v-1]+=h[v];h[v]=ost;}v--;
            }while(v>=0);   
            do{q[w]=n[w]+h[w];m[w]=q[w];w--;}while(w>=0);
            do 
            {   
            if(m[K]>=10)
             {ost=m[K]%10;m[K]-=ost;m[K]/=10;m[K-1]+=m[K];m[K]=ost;}K--;
             }while(K>=0);
             
        }
}
while(m[c]==0)c++;
    cout<<endl;
    if(vvid>=11)
    {for(k1=c;k1<=j;k1++)
    cout<<m[k1];
    cout<<endl;}
    else if(vvid<=10)
        for(k1=c;k1<=j;k1++)cout<<m[k1];
    getch();
    return 0;
}
Добавлено через 43 секунды
вернее умножение в столбец.щитает 10000!за 5 мин гдето.
iama
 Аватар для iama
1249 / 974 / 48
Регистрация: 30.07.2010
Сообщений: 5,297
05.09.2011, 21:18     Вывести факториал числа #10
Мое решение
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
51
52
53
54
55
56
57
58
59
#include <iostream>
#include <vector>
 
using namespace std;
 
 typedef vector <int> lnum;
 
#define base 1000000000 // 10^9
 
void lwrite (const lnum &a, FILE *f)
 {
    if (a.empty())
    {
        fprintf(f, "0");
        return;
    }
 
    fprintf(f, "%d", a.back());
 
    for (int i = a.size() - 2; i >= 0; i--)
        fprintf(f, "%09d", a[i]);
 }
 
void lmul (lnum &a, int b)
 {
    int carry = 0;
 
    for (int i = 0; i < a.size() || carry; i++) 
    {
        if (i == a.size())
            a.push_back(0);
 
        long long cur = carry + a[i] * 1ll * b;
        a[i] = int (cur % base);
        carry = int (cur / base);
    }
 
    while (a.size() > 1 && a.back() == 0)
        a.pop_back();
 }
 
int main()
 {
    lnum a;
    int i, n;
 
    scanf("%d", &n);
 
    a.push_back(1);
 
    for (i = 2; i <= n; i++)
        lmul(a, i);
 
    lwrite(a, stdout);
 
    printf("\n");
 
    return 0;
 }
Не старался, но вышло, вроде, неплохо
nameless
Эксперт C++
 Аватар для nameless
289 / 288 / 14
Регистрация: 16.06.2009
Сообщений: 486
05.09.2011, 22:06     Вывести факториал числа #11
4atty,

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
 
typedef unsigned long long T_big_integer;
 
template <int N>
struct Factorial {
   static constexpr T_big_integer result = N * Factorial <N - 1>::result;
};
 
template <>
struct Factorial <1> {
   static constexpr T_big_integer result = 1;
};
 
int main() {
   std::cout << Factorial <5>::result << std::endl;
 
   return 0;
}
iama
 Аватар для iama
1249 / 974 / 48
Регистрация: 30.07.2010
Сообщений: 5,297
05.09.2011, 22:09     Вывести факториал числа #12
nameless, мы тут длинками балуемся, а вы тут со своим 64-битным беззнаковым...
KING1994
-68 / 6 / 0
Регистрация: 18.07.2011
Сообщений: 77
06.09.2011, 19:20     Вывести факториал числа #13
Я вот не шарю поч так долго щитает у меня великие массивы(до 5 мин доходило)мб динамические массивы решат ету проблему?
iama
 Аватар для iama
1249 / 974 / 48
Регистрация: 30.07.2010
Сообщений: 5,297
06.09.2011, 20:15     Вывести факториал числа #14
KING1994, выделение памяти из кучи прироста в продуктивности априори не даст. У вас кривой малочитаемый алгоритм с кучей магических чисел.
adamo86
2 / 2 / 0
Регистрация: 10.04.2011
Сообщений: 185
06.09.2011, 21:20     Вывести факториал числа #15
Вот рекурсивный метод вычисления факториала n:

C++
1
2
3
4
5
6
long factor (int n) 
{
  if (n<0) return 0;        
  if (n==0) return 1;       
  return factor(n-1)*n;     
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.09.2011, 22:26     Вывести факториал числа
Еще ссылки по теме:

Факториал числа C++
C++ Рекурсия: факториал числа
C++ Факториал числа с рекурсией

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

Или воспользуйтесь поиском по форуму:
KING1994
-68 / 6 / 0
Регистрация: 18.07.2011
Сообщений: 77
06.09.2011, 22:26     Вывести факториал числа #16
В смысле малочитаемый?
Yandex
Объявления
06.09.2011, 22:26     Вывести факториал числа
Ответ Создать тему
Опции темы

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