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
原创粉丝点击