栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

c语言:阶乘(包括大数)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

c语言:阶乘(包括大数)

            一个正整数的阶乘(factorial)是所有小于及等于该数的正整数的积,并且0的阶乘为1。自然数n的阶乘写作n!。这是在1808年,基斯顿·卡曼引进这个表示。即n!=1×2×3×...×n。阶乘亦可以递归方式定义:0!=1,n!=(n-1)!×n。

            对于一般的小数求阶乘,我们一般有两种方法:一是使用循环求解,二是利用递归的方法进行求解,第二种方法可能要求要更高一点。下面我们通过一个小例子来看看。

            问题:输入一个小数字,输出其对应的阶乘。

            一:循环:

#include
int main()
{
    int firstnumber;
    int result = 1;//此处可以用long或者long long不过对应的输出也要改
    scanf("%d", &firstnumber);
    for (int i = 1; i <= firstnumber; i++)
    {
        result *= i;
    }
    printf("%dn", result);
    return 0;
}

二:递归:

#include
int factorial(int n)
{
    if (n == 0 || n == 1)//递归终止条件
    {
        return 1;
    }
    else
    {
        return n * factorial(n - 1);
    }
}
int main()
{
    int firstnumber;
    scanf("%d", &firstnumber);
    printf("%dn", factorial(firstnumber));
    return 0;
}

             但这两种方法都只能对小数求阶乘有用,我刚刚开始写那个对大数求阶乘的时候就想着,大数,大不了我输出的时候给你用个%ld呗,再不行的话就改为%lld咯,想的到挺美好,不过终究还是抵不过现实呀!我尝试了很多遍,发现用lld的输出格式也最多只能计算出168(不一定完全正确)以下的数的阶乘。而在C语言中如果想要输出一个很大的数字,也就是说要输出很多数字字符,这样的话我们不难想到要用数组来进行存储和输出,在这个过程中,我们只要保证数组的长度足够长就能表示出来。

          其基本思想:我们可以将一个数组看成一个数字,然后我们将乘数和被乘数的低位到高位依次相乘,加上每位计算的进位数,依次得到每一位的结果。

          无论乘数有多少位,都将乘数看成一个整体,与低位相乘加上该位的进位数得到一个临时的数字,这个临时的数字的最后一个数就是我们需要的一位(%10),然后除去最低位后的数作为下一位的余数,当被乘数每一位乘完之后,如果余数不为0,就将其依次放入我们需要的结果当中。

   可能看的不太懂哈,毕竟我也不是很懂,哈哈哈哈哈。​​​​​​接下来就看看代码

   问题:编写程序,输入整数 n(0 ≤ n ≤ 10000),计算 n!(有多组数据,每组一个 n)

#include
int main()
{
    int a[1000], m,i, j, c, t;
    long n;
    while (scanf("%d", &n) != EOF)
    {
        a[0] = 1;
        m = 1;
        for (i = 2; i <= n; i++)
        {
            for (c = 0, j = 0; j < m; j++) {
                t = a[j] * i + c;
                a[j] = t % 10;
                c = t / 10;
            }
            while (c) {
                a[m++] = c % 10;
                c /= 10;
            }
 
 
        }
        for (j = m - 1; j >= 0; j--)
            printf("%d", a[j]);
        printf("n");
    }
    return 0;
 
}

希望对您有帮住,各位观众老爷们。
 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/690080.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号