You are on page 1of 3

#include<iostream>

#include<iomanip>
//for setw()
#include<cmath>
//for log10
#include<cstdlib>
using namespace std;
//---------------------------------------int getN();
int getBitNum(int n);
char* init(int size);
void jieCheng(char*a,int n);
void display(char*a,int size);
void factorial();
//========================================
//========================================
int main()
{
while(true)
{
char play;
factorial();
cout<<"Another time?<y/n>";
cin >>play;
if(play=='n')break;
}
system("PAUSE");
return 0;
}
//========================================
//========================================
//***********????*******************//
void factorial()
{
int n=getN();
//?? n
int size=getBitNum(n); //? n ???
char*pa=init(size);
//????????
jieCheng(pa,n);
//? n!
display(pa,size);
//?? n!
delete[]pa;
}
//**************************************//
int getN()
{
int n;
while(true)
{
try
{ cout<<"Input n of n!:\n";
cin >>n;
if(n<0)throw 0;
}
catch(int tag)
{
continue;
}
break;
}
if(n==0)
exit(EXIT_FAILURE);

return n;
}
//--------------------------------------int getBitNum(int n)
{
double sum=1.0;
for(int i=1;i<=n;i++)
sum+=log10(i);
return (int)sum;
}
//--------------------------------------char* init(int size)
{
char*pa;
try
{
pa=new char[size];
}
catch(bad_alloc)
{
cerr<<"new:unable to allocate storage of "
<<size<<endl;
exit(EXIT_FAILURE);
}
pa[0]=1;
//???? 1;pa[0]????
for(int i=1;i<size;i++)
pa[i]=0;
//?????0;
return pa;
}
//****************************************//
//
???? factorial ?????
//
//****************************************//
void jieCheng(char*a,int n)
{
double bitCount=1.0;
//? n! ?????
int begin=0;
//? n!?????
for(int i=2;i<=n;i++)
//??? 1 ?
{
int jinWei=0;
//????
bitCount+=log10(i); //? i! ?????
if(a[begin]==0)
begin++;
//????? 0
for(int j=begin;j<(int)bitCount;j++)
{ jinWei+=i*a[j];
a[j]=(char)(jinWei%10); //??
jinWei/=10;
//??
}
}
}
//*******************************************
//------------------------------------------void display(char*a,int size)
{
long bit=0;
for(int i=size-1;i>=0;i--) //???????
{
if(bit%50==0)
//?50????

{cout<<endl<<"?"<<setw(3)<<(bit/50+1)
<<"?50?:";
}
cout<<(int)a[i];
bit++;
}
cout<<"\n??"<<bit<<"?"<<endl;
}

You might also like