- 论坛徽章:
- 0
|
[help]超大數求(factorial)
//效率不是很高,不过对大数没问题,主要限制是计算速度。
#include<iostream.h>;
#include<math.h>;
#include<time.h>;
unsigned long int getN();
double getsize(unsigned long int n);
char * initarray(unsigned long int size);
double calculate(char * add,unsigned long int n);
void multiply(char * add, unsigned long int n);
void displayresult(char * add, unsigned long int size);
//---------输入数字-----------------------
unsigned long int getN()
{unsigned long int n;
cout<<"lease input a number: ";
cin>;>;n;
while(n<0)
{
cout<<"Input must be larger than 0.\nPlease input again: ";
cin>;>;n;
}
return n;
}
//---------------计算结果共有多少位-------------
double getsize(unsigned long int n)
{unsigned long int i;double size=1;
for (i=1;i<=n;i++)size=size +log10(i);
cout<<"the result has "<<(unsigned long int)size<<"(10) digits\n";
size++;
return size;
}
//---------------初始化存放结果的数组,‘a’标记结果的最后一位--------------
char * initarray(unsigned long int size)
{
unsigned long int i;
char * address=new char[size];
if(!address)
{
cout<<"number is too large";
}
address[0]=1;
address[1]=97;//97 is 'a'
for (i=2;i<size;i++)
address=0;
return address;
}
//---------------算阶乘-----------------
double calculate(char * add,unsigned long int n)
{
double t1=clock();
unsigned long int width;
cout<<"\n Now calculating... ";
for(unsigned long int i=1;i<=n;i++)
{
cout<<i;
width=log10(i);
for(unsigned long int j=0;j<=width;j++)cout<<"\b";
multiply(add,i);
}
double t2=clock();
return (t2-t1)/CLK_TCK;
}
//-------------模拟进位乘法-------------------
void multiply(char * add, unsigned long int n)
{unsigned long int intermediate, intermediatequot=0;
unsigned long int pointer=0;
while(add[pointer]==0){pointer++;};
while(add[pointer]!='a')
{
intermediate=add[pointer]*n;
intermediate+=intermediatequot;
intermediatequot=intermediate/10;
add[pointer]=intermediate-intermediatequot*10;
pointer++;
}
while(intermediatequot>;=1)
{
add[pointer]=intermediatequot-intermediatequot/10*10;
intermediatequot=intermediatequot/10;
pointer++;
}
add[pointer]='a';
}
//------------------显示结果--------------
void displayresult(char * add, unsigned long int size)
{
unsigned long int i=size;
while(add!='a'){i--;}
int v=51;
while(i>;0)
{i--;v--;
if(v==50)
{
cout<<"\n";
cout.width(10);
cout<<i+1;
cout<<": ";
}
if(v%10==0){cout<<' '; }
cout<<(int)(add);
if(v==1)v=51;
}
}
//--------------------------------
main()
{unsigned long int n;char quit;
while(quit!='y'&&quit!='Y')
{n=getN();
unsigned long int size=getsize(n);
char * address=initarray(size);
double time_used=calculate(address,n);
displayresult(address,size);
cout<<"\nCalculation used "<<time_used<<" seconds.";
delete []address;
cout<<"\nquit?(Y/N)";cin>;>;quit;cout<<"\n";
}
return 1;
} |
|