HDU 1042

计算N!,其中0<=N<=10000。没有太多,就是个裸的大数问题。写下了有个大数模板以供使用。


代码如下:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
class big_number{
public:
    int len;
    char num[41000];
    big_number(){
        len=1;
        for(int i=0;i<40101;++i) this->num[i]='0';
    }

    big_number(int len,char str[]){
        this->len=len;
        for(int i=0;i<40101;++i) this->num[i]='0';
        for(int i=0;i<len;++i)  this->num[len-1-i]=str[i];
    }

    big_number operator +(const big_number& a){
        big_number ans;
        int L=max(this->len,a.len);
        int carry=0;
        for(int i=0;i<L;++i){
            carry=a.num[i]-'0'+this->num[i]-'0'+carry;
            ans.num[i]=carry%10+'0';
            carry=carry/10;
        }
        if(carry==0) ans.len=L;
        else{
            ans.len=L+1;
            ans.num[L]=carry+'0';
        }
        return ans;
    }

    big_number operator +(int a){
        big_number ans;
        int i=0;
        while(a){
            a=a+this->num[i]-'0';
            ans.num[i]=a%10+'0';
            a=a/10;
            i++;
        }
        while(i<this->len) {
            ans.num[i]=this->num[i];
            i++;
        }
        ans.len=i;
        return ans;
    }

    big_number operator *(const big_number& a){
        big_number ans;
        big_number temp;
        for(int i=0;i<this->len;++i){
            int mul=this->num[i];
            int carry=0;
            for(int j=0;j<a.len;++j){
                int temp_num=mul*(a.num[j]-'0')+carry;
                temp.num[j+i]=temp_num%10+'0';
                carry=temp_num/10;
            }
            if(carry==0) temp.len=a.len+i;
            else {
                temp.len=a.len+1+i;
                temp.num[a.len+i]=carry+'0';
            }
            ans=ans+temp;
        }
        return ans;
    }

    big_number operator *(int a){
        big_number temp;
        int carry=0;
        for(int j=0;j<this->len;++j){
            carry=carry+(this->num[j]-'0')*a;
            temp.num[j]=carry%10+'0';
            carry=carry/10;
        }
        if(carry==0) temp.len=this->len;
        else{
            int i=0;
            while(carry){
                temp.num[this->len+i]=carry%10+'0';
                carry=carry/10;
                i++;
            }
            temp.len=this->len+i;
        }
        return temp;
    }
};
big_number ans[1010];
big_number fin;
int main(){
    int n;
    ans[0].len=1,ans[0].num[0]='1';
    for(int i=1;i<1001;++i){
        ans[i]=ans[i-1];
        for(int j=(i-1)*10+1;j<=i*10;++j)
            ans[i]=ans[i]*j;
    }
    while(scanf("%d",&n)!=EOF){
        fin=ans[n/10];
        int l=n%10;
        for(int i=1;i<=l;++i)
            fin=fin*(n-l+i);
        for(int i=fin.len-1;i>=0;--i)
            printf("%c",fin.num[i]);
        printf("\n");
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值