【2006】求N!的精确值

Time Limit: 3 second
Memory Limit: 2 MB

对于阶乘函数,即使自变量较小,其函数值也会相当大。例如: 10!=3628800 25!=15511210043330985984000000 若用integer型数据表示阶乘,最多仅可用7!,用longint类型类型亦只能到12!。设计一个程序,当键入一个正整数n(1<=n<=100)时,输出n!的精确值。

如果N的值不在规定的范围,将输出“error”。

Input

输入文件中只一个数字,表示要计算的n的值(1<=n<=100)。

Output

输出N!的精确值

Sample Input

12

Sample Output

12!=479001600

【题解】

高精度*单精度。乘的时候要记录进位信息。然后处理进位即可。不断更新数字的长度。最后倒叙输出

【代码】


 

#include <cstdio>
#include <stdlib.h>

const int MAXN = 500;

int n,a[MAXN],la = 1;

void input_data() //输入数据
{
    scanf("%d",&n);
    if ( n<1 || n>100) //输出错误信息
        {
            printf("error");
            exit(0);
        }
    for (int i = 2; i <= MAXN;i++)
        a[i] = 0;
    a[1] = 1; //先置1方便后面乘
}

void get_ans()
{
    for (int i = 1;i <= n;i++) //从1 一直 乘到n
        {
            int x = 0;
            for (int j = 1;j <= la;j++) //对现在的数字的每一位都乘上i  x用来保存进位信息
                {
                        a[j] = a[j] * i + x;
                        x = a[j] / 10;
                        a[j] = a[j] % 10;
                }
            while (x > 0) //如果进位数字>0则 数字的位数可以增加 不断增加即可
                {
                    la++;
                    a[la] += x;
                    x = a[la] / 10;
                    a[la] = a[la] %10;
                }
        }
}

void output_ans()
{
    printf("%d!=",n);
    for (int i = la;i >= 1;i--)
        printf("%d",a[i]);

}

int main()
{
    input_data();
    get_ans();
    output_ans();
    return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值