n! 如何计算?
1.最简单的计算
#include <iostream>
using namespace std;
int fun(int n){
int sum=1,i;
if(n==0)
return 1;
for(i=1;i<=n;i++)
sum*=i;
return sum;
}
int main()
{
int n;
while(cin>>n)
cout<<fun(n)<<endl;
return 0;
}
2.稍微的扩展
#include <iostream>
using namespace std;
long long fun(long long n){
long long sum=1,i;
if(n==0)
return 1;
for(i=1;i<=n;i++)
sum*=i;
return sum;
}
int main()
{
long long n;
while(cin>>n)
cout<<fun(n)<<endl;
return 0;
}
3.数组计算
#include <iostream>
#include <string.h>
using namespace std;
int result[10005]; //用来存储结果
void fun(int n){
int i,j;
int sum=1,ans=0; //ans表示进位
memset(result,0,sizeof(int)*10005);
j=0;
result[j]=1;
for(i=1;i<=n;i++){
for(j=0;j<10005;j++){
sum=result[j]*i+ans;
result[j]=sum%10;
ans=sum/10;
}
}
}
int main()
{
int n,i,j;
while(cin>>n){
fun(n);
for(i=10004;i>=0;i--){
if(result[i]!=0)
break;
}
for(j=i;j>=0;j--)
cout<<result[j];
cout<<endl;
}
return 0;
}
可以优化每次计算的次数,不需要每次计算都将数组遍历一边而是计算到当前的位数
void fun(int n){
int i,j,num=0,k,t; //num表示当前的位数,即需要计算的数组的位数
int sum=1,ans=0; //ans表示进位
memset(result,0,sizeof(int)*10005);
j=0;
result[j]=1;
num=1;
for(i=1;i<=n;i++){
for(j=0;j<num;j++){ //缺陷是每次计算的时候循环次数太多,可以改的每次的循环次数减少到只要计算到当前的位数
sum=result[j]*i+ans; //怎么记录当前的位数?根据前一次的位数,算最后那位的是否有进位再算
result[j]=sum%10; //优化到每次计算的时候只需要计算到当前的位数
ans=sum/10;
k=ans;
t=num-1;
if(j==t){ //if算的是最后一位
while(k){
k=k/10;
num++;
}
}
/*while(k){
k=k/10;
num++;
}*/
}
}
}