Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как написать функцию факториала?

7.3K
18 мая 2004 года
woodelf
5 / / 18.05.2004
Народ! :o подскажите плиз как написать функцию на С реализующую факториал -
Вводится N, необходимо найти факториал N!=1*2*3*...*N где N <= 1000.
По сути факториал это умножение последовательных числел до N.
Или может писал кто такую - киньте плиз!!

wbr,woodelf
1.3K
18 мая 2004 года
Pochemuchka
100 / / 16.12.2003
Цитата:
Originally posted by woodelf
Народ! :o подскажите плиз как написать функцию на С реализующую факториал -
Вводится N, необходимо найти факториал N!=1*2*3*...*N где N <= 1000.
По сути факториал это умножение последовательных числел до N.
Или может писал кто такую - киньте плиз!!

wbr,woodelf



Один вариант

int i,summ=1;
for (i=1;i<=1000;i++)
summ=summ*i

2.1K
18 мая 2004 года
cozy
69 / / 11.01.2004
Цитата:
Originally posted by woodelf
Народ! :o подскажите плиз как написать функцию на С реализующую факториал -
Вводится N, необходимо найти факториал N!=1*2*3*...*N где N <= 1000.
По сути факториал это умножение последовательных числел до N.
Или может писал кто такую - киньте плиз!!

wbr,woodelf



int fact(int n)
{
for(int j=0; j<1000; j++)
n*fact(n);
return n;
}

По-моему так, точно не помню, пишу на скорую руку

6.0K
18 мая 2004 года
Porphirius
19 / / 12.05.2004
Цитата:
Originally posted by cozy


int fact(int n)
{
for(int j=0; j<1000; j++)
n*fact(n);
return n;
}

По-моему так, точно не помню, пишу на скорую руку



Эта функция приведет имхо только к зависанию компа...

Цитата:
int i,summ=1;
for (i=1;i<=1000;i++)
summ=summ*i;



Данный вариант может осилить только 12!


Вообще говоря для этих целей используют "длинную" арифметику,т.е. циферки по 20 байт и более, разумеется для них определяют арифметические операторы...чтобы можно было работать. Если вам неохота заниматься этим, в инете полно готовых либ на эту тему....

__int64 Factorial(unsigned N)
{
__int64 result=1;
for(unsigned i=2;i<N+1;i++) result*=i;
return result;
}

этот тривиальнейший вариант =)) может осилить уже(!) :) 20!. А дальше... дальше пишете свой или используете готовый класс вместо __int64

294
19 мая 2004 года
Plisteron
982 / / 29.08.2003
Цитата:
Originally posted by Porphirius
А дальше... дальше пишете свой или используете готовый класс вместо __int64



Ага, что-то вроде либы
"Огромные числа" (http://www.delphiworld.narod.ru/base/huge_numbers.html).
Или использовать тип double (хоть в нём всего 15 значащих десятичных цифр, зато экспонента сиречь порядок есть, большие числа факториалить можно.

6.0K
19 мая 2004 года
Porphirius
19 / / 12.05.2004
Цитата:
Originally posted by Plisteron
использовать тип double (хоть в нём всего 15 значащих десятичных цифр, зато экспонента сиречь порядок есть, большие числа факториалить можно.



Метко заметил ;)... из курса мат.анализа вам может быть известна формула Стирлинга. При помощи этой формулы можно приближенно вычислять значение факториала для больших циферъ...А если использовать тип long double..то мне кажется 1000! можно осилить при помощи этой формулы

1.8K
19 мая 2004 года
kas
71 / / 03.02.2004
Цитата:
Originally posted by woodelf
Народ! :o подскажите плиз как написать функцию на С реализующую факториал -
Вводится N, необходимо найти факториал N!=1*2*3*...*N где N <= 1000.
По сути факториал это умножение последовательных числел до N.
Или может писал кто такую - киньте плиз!!

wbr,woodelf


Это тебе в институте задали?? Мог бы мне написать! :)

7.3K
19 мая 2004 года
woodelf
5 / / 18.05.2004
Всем спасибо. Я тоже так разобрался и понял что проблема тут в другом: я хочу попробовать её написать таким образом:
В принципе просто делается цикл:
for(i=1;i<N;i++)
{
p=n*(n-1)*f;
f=p;
n=n-2;
}
Который в идеале в прнципе считает факториал но только не очень больших чисел.
Смотрите тут в чем вопрос, что в третей строке переменная f - по сути в которой и будет
храниться факторил числа должная быть очень болшой поскольку число должно получиться
с многими нулями(факториал 6! это уже 720). То есть надо наверно f делать строкой.
А как тогда домножать получающееся число p на строку??

Можно так вообще сделать?
7.3K
19 мая 2004 года
woodelf
5 / / 18.05.2004
хотя всё равно не угадаешь какой длины строку делать....
А можете поподробнее про формулу Стирлинга рассказать?? Реально ей воспользоваться?- мне очень точно и не надо - мне надо тока посчитать сколько нулей получится у энтого факториала.
443
21 мая 2004 года
REmindER
292 / / 23.03.2003
Алгоритм подсчета совсем прост:

int FacMax = 10000;

const Lim = 10000;

int Vals[Lim] = {0};
int Maxv = 9999;

Vals[Lim - 1] = 1;

int Remv = 0;

for(int X = 1; X <= FacMax; X ++)
{
for(int Y = Lim - 1; Y > -1; Y --)
{
Vals[Y] = Vals[Y] * X + Remv;
Remv = 0;
if(Vals[Y] > Maxv)
{
Remv = Vals[Y] / (Maxv + 1);
Vals[Y] = Vals[Y] - Remv * (Maxv + 1);
};
};
};

Факториал 10000, к примеру, считается им около 8 секунд на машине Celeron533 и составляет 35660 знаков.
443
21 мая 2004 года
REmindER
292 / / 23.03.2003
10000
7.3K
21 мая 2004 года
woodelf
5 / / 18.05.2004
Цитата:
Originally posted by REmindER
10000


Во спасибо Reminder!!
Ну вобщем да..с помощью строки её реальней всего написать. Я тоже написал но она у меня пока только факториал до 366 считает - это число из 781 знака. как допишу до конца так кину исходник может тоже кому пригодится..!

7.3K
22 мая 2004 года
woodelf
5 / / 18.05.2004
Вот короче прога моя - тоже считает факториал всех чисел до 1000 (ну и там считает нули ещё)...
А вот если 1000 и больше -уже не работает.Почему не пойму, вроде массива там должно хватать..
Работает конечно не так быстро.
Посмотрите плиз кому не лень - что там происходит если 1000 и больше ввести...


//-----------------------------Fucktorial-----------------------------------
#pragma hdrstop
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
//--------------------------------------------------------------------------
void main()
{
clrscr();
char C[4],A[10000],B[10000],D[10000];
char E[]="123456789";
int i,j,k,l,m,n,o,p,q,r,s,t,f;
for(i=0;i<9999;i++)
{A='0';
B='0';
D='0';
}
A[9998]='1';
A[9999]='\0';
B[9999]='\0';
D[9999]='\0';
printf("Factorial chego schitat'? : ");
scanf("%d",&f);
printf("Podozhdite, schitayu....\n");
for(i=1;i<=f;i++)
{
itoa(i,C,10);
k=strlen(C);
for(j=k;j>0;j--)
{n=(C[j-1]-48);
s=(abs(j-k));
for(l=9998;l>=3;l--)
{m=A[l]-48;
o=B[l-s]-48;
p=n*m+o;
r=p%10;
q=(int)(p-r)/10;
if(p<10)
{r=p;
q=0;
}
B[l-s]=r+48;
B[l-s-1]=q+48;
}
for(l=9999;l>0;l--)
{m=B[l-1]-48;
o=D[l-1]-48;
p=m+o;
r=p%10;
q=(int)(p-r)/10;
if(p<10){r=p;q=0;}
D[l-1]=r+48;
D[l-2]+=q;
}
for(l=0;l<9999;l++)B[l]='0';
}
strcpy(A,D);
for(l=0;l<9999;l++)D[l]='0';
}
char* point=strpbrk(A,E);
printf("%d!=%s",f,point);
k=strlen(point);
char a='0';
while(a!='1')
{n=0;
for(i=0;i<k;i++)
if(*(point+i)==a)n++;
printf("\nV factoriale chisel '%c' - %d ",a,n);
a++;
}
printf("\nKolichestvo znakov v %d! : %d",f,k);
if(!getch())getch();
}
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог