Как написать функцию факториала?
Вводится N, необходимо найти факториал N!=1*2*3*...*N где N <= 1000.
По сути факториал это умножение последовательных числел до N.
Или может писал кто такую - киньте плиз!!
wbr,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
Народ! :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;
}
По-моему так, точно не помню, пишу на скорую руку
int fact(int n)
{
for(int j=0; j<1000; j++)
n*fact(n);
return n;
}
По-моему так, точно не помню, пишу на скорую руку
Эта функция приведет имхо только к зависанию компа...
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
А дальше... дальше пишете свой или используете готовый класс вместо __int64
Ага, что-то вроде либы
"Огромные числа" (http://www.delphiworld.narod.ru/base/huge_numbers.html).
Или использовать тип double (хоть в нём всего 15 значащих десятичных цифр, зато экспонента сиречь порядок есть, большие числа факториалить можно.
использовать тип double (хоть в нём всего 15 значащих десятичных цифр, зато экспонента сиречь порядок есть, большие числа факториалить можно.
Метко заметил ;)... из курса мат.анализа вам может быть известна формула Стирлинга. При помощи этой формулы можно приближенно вычислять значение факториала для больших циферъ...А если использовать тип long double..то мне кажется 1000! можно осилить при помощи этой формулы
Народ! :o подскажите плиз как написать функцию на С реализующую факториал -
Вводится N, необходимо найти факториал N!=1*2*3*...*N где N <= 1000.
По сути факториал это умножение последовательных числел до N.
Или может писал кто такую - киньте плиз!!
wbr,woodelf
Это тебе в институте задали?? Мог бы мне написать! :)
В принципе просто делается цикл:
for(i=1;i<N;i++)
{
p=n*(n-1)*f;
f=p;
n=n-2;
}
Который в идеале в прнципе считает факториал но только не очень больших чисел.
Смотрите тут в чем вопрос, что в третей строке переменная f - по сути в которой и будет
храниться факторил числа должная быть очень болшой поскольку число должно получиться
с многими нулями(факториал 6! это уже 720). То есть надо наверно f делать строкой.
А как тогда домножать получающееся число p на строку??
Можно так вообще сделать?
А можете поподробнее про формулу Стирлинга рассказать?? Реально ей воспользоваться?- мне очень точно и не надо - мне надо тока посчитать сколько нулей получится у энтого факториала.
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 знаков.
10000
Во спасибо Reminder!!
Ну вобщем да..с помощью строки её реальней всего написать. Я тоже написал но она у меня пока только факториал до 366 считает - это число из 781 знака. как допишу до конца так кину исходник может тоже кому пригодится..!
А вот если 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();
}