【算法设计与分析】—— n的阶乘问题(eg:求100的阶乘 结果中的所有位数都精确输出)

n的阶乘问题(eg:求100的阶乘 结果中的所有位数都精确输出)

算法题目

在这里插入图片描述

  • 其实这个求n的阶乘问题,我们在刚刚学习c语言的时候,应该就有大致的了解过了,那个时候我们可能会设置一个循环变量,或者使用递归方法,但是当n比较大时,我们会怎么做呢?

  • 本文主要是将结果存放在int类型的数组中,然后每个单元存放6位数,整体思想还是采用我们小学时的竖乘法。

    戳视频链接:n的阶乘问题视频讲解

    再次声明:因为我本人主要是录着玩玩的,所以讲解时并没有备稿~

算法分析

  • 输出结果时注意格式的控制,尤其是关于0的问题,因为int和char不太一样,如果结尾6个0,不控制好格式的话,可能就只剩下一个0了!!!

  • 分析中,书上有一个地方印刷错误,应该是699238,不是699263!!!

  • 竖式乘法我大致画了一个图帮助大家理解:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

代码实现

#include<stdio.h>
//求n!
int main()
{
    int s[256];   //用来存放运算结果
    int n;        //用来输入求谁的阶乘
    int d;        //用来表示进位
    int b;        //用来表示临时结果
    int m=1;      //用来表示占用数组的单元个数
    int i,j,k;    //循环变量   i表示运算数循环变量   j表示运算结果数组循环变量   k表示输出控制循环变量

    s[1]=1;

    printf("请输入你想求哪个数(n)的阶乘:\n");
    scanf("%d",&n);

    for(i=2;i<=n;i++)
    {
        d=0;

        for(j=1;j<=m;j++)
        {
            b=s[j]*i+d;
            s[j]=b%1000000;
            d=b/1000000;
        }

        if(d!=0)
        {
            m++;
            s[m]=d;
        }
    }

    printf("%d ",s[m]);

    for(k=m-1;k>=1;k--)
        printf("%06d ",s[k]);    //因为int不比char,所以控制0需要注意


    return 0;
}

结果示例

  • 示例一
    在这里插入图片描述
  • 示例二
    在这里插入图片描述
  • 示例三
    在这里插入图片描述
原创文章 55 获赞 74 访问量 9941

猜你喜欢

转载自blog.csdn.net/qq_43779149/article/details/106177065