求n!
/*
题目:求n!
类型:高精度
作者:发烧的小龙虾
时间:2018.4.17
*/
#include <bits/stdc++.h>
using namespace std;

int weishu(int n)/*n!一共有这么多位*/
{
    int i;
    double s=0;/*注意这里一定是double类型,因为log算出来是小数,如果int会误差很大*/
    for(i=1;i<=n;i++)
        s+=log10(i);
    return ceil(s);
}

int main()
{
    int len,i,j,n,k;
    static int a[1000000];
    while(~scanf("%d",&n))
    {
        memset(a,0,sizeof(a));
        a[0]=1;//初始化,因为是不停的乘,所以这里初始化为1而不是0
        len=weishu(n);//len为那个数的位数,就len这么多位
        for(j=1;j<=n;j++)//从两个方面理解这句话,因为是n!所以要进行n重循环,第二是每次我都要乘i,i从1到n
        {
            k=0;//k为进位符,初始化为0,放在大循环内是因为每轮循环都要初始化进位符
            for(i=0;i<len;i++)//在这个长度里面,不用担心最后一个数字会溢出,因为它再大,也大不过len,因此在最后一位上不可能会出现溢出情况
            {
                a[i]=a[i]*j+k;
                k=a[i]/10;
                a[i]=a[i]%10;
            }
        }
        for(i=len-1;i>=0;i--)//len-1其实是第一个字符,但是我们必须倒回去找第一个不是0的数
            if(a[i]!=0)
                break;
        for(;i>=0;i--)//找到之后就逆序输出,就完事儿了
            printf("%d",a[i]);
        printf("\n");
    }
}

阅读更多
个人分类: 高精度
想对作者说点什么? 我来说一句

java 求n的n次方

2010年06月18日 59KB 下载

java 求n的幂数与倍数

2010年06月21日 59KB 下载

矩阵的求逆、相乘,以及转置

2012年05月20日 39KB 下载

N个集合求交集C语言代码

2012年01月13日 1KB 下载

求n以内阶层的和

2012年09月09日 212B 下载

求前N项和.rar

2012年03月24日 409KB 下载

斐波拉契数列(C语言代码)

2018年03月14日 352B 下载

没有更多推荐了,返回首页

不良信息举报

求n!

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭