codeup 1000以内的阶乘 (高精度) 题解

/*
题目描述
输入一个正整数N,输出N的阶乘。
输入
正整数N(0<=N<=1000)
输出
输入可能包括多组数据,对于每一组输入数据,输出N的阶乘
样例输入
0
4
7
样例输出
1
24
5040
*/

题目链接:http://codeup.cn/problem.php?cid=100000593&pid=1
#include<stdio.h>
#include<string.h> 
struct bign
{
    int d[4000];
    int len;
    bign()
    {
        len=0;
        memset(d,0,sizeof(d));
    }
};
bign table[1002];
//高精度与低精度乘法 
void multiply(bign a,int b,bign &c)
{
    int i,carry=0;
    for(i=0;i<a.len;i++)
    {
        int temp=a.d[i]*b+carry;
        c.d[c.len++]=temp%10;
        carry=temp/10;
    }
    while(carry!=0)//进位可能不止一位 
    {
        c.d[c.len++]=carry%10;
        carry/=10;
    }
}

void makeTable(bign t[])
{
    int i=0;
    for(i=1;i<=1000;i++)
    {
        multiply(t[i-1],i,t[i]);//t[i]=t[i-1]*i; 即n!=(n-1)!*n 
    }
}

int main()
{
    int n;
    table[0].d[0]=1;
    table[0].len=1;
    makeTable(table);
    while(scanf("%d",&n)!=EOF)
    {
        int i;
        for(i=table[n].len-1;i>=0;i--)
            printf("%d",table[n].d[i]);
        printf("\n");
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值