n!
来源:互联网 发布:淘宝商户提现手续费 编辑:程序博客网 时间:2024/04/28 09:15
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++; }*/ } }}
0 0