做题时遇到一道题,计算150的阶乘并打印,没有任何思路T_T,百度了一下看到了很多巨巨写的代码,看了好久才明白。
要向巨巨们学习,好东西要分享出来,才不像某人一样藏在自己的草稿箱里(此处做一个鄙视的表情),弱以后解决了一些较难的问题,也会在这里分享~
废话不多,开始正题。
目标:利用数组模拟数字,实现计算大数字阶乘
编程语言:C/C++
编译环境 code::blocks 13.12
解析:
1.读题
所给的数据为大数字,long long int也不过64位,没有足够的空间来储存阶乘,所以想到了数组模拟数字的思想。
2.解题思路
用一道小学竖式运算来做引例
1 2 3 4
* 5
———
6170
如上图,不难想到,利用数组来模拟这一过程,用若干个<10的正整数组成数组来模拟数字,然而上图乘法运算用低位开始逐个乘以乘数, 于是在数组中逆置模拟数字,下图给出1-7的模拟阶乘运算思路
0--1
1--1
2--2
3--6
4--4 2
5--0 2 1
6--0 2 7
7--0 4 0 5
3.具体操作
声明一个整形数组nun[200]用于模拟数字,数组大小大于结果数字位数,声明变量temp、digit、next分别用于临时储存每一位的阶乘结果,数字位数、以及进位。首先,对于每一次求n的乘数,最大的循环从2到n,表示阶乘数依次进入循环操作。接下来的循环从1到digit,表示阶乘数依次从低位数字开始向高位数字阶乘。
每一次阶乘,用变量temp临时储存该位的结果,将temp的个位数字储存在该数位(digit)上,将temp除10的结果赋给next,并在下一位阶乘时相加。对于最后一位阶乘之后,如果next还存在,重复上述方案, 将next储存在num数组中,直到next为0,此时digit发生改变。
甩代码
#include<stdio.h>
int main()
{
int i,j,n,m;
while(scanf("%d",&m)!=EOF)
{for(n=0;n<=m;n++)
{
int num[200];
num[0]=1;
int digit=1;
int next;
int temp;
for(i=2; i<=n; i++)
{
for(j=1,next=0; j<=digit; j++)
{
temp=num[j-1]*i+next;
num[j-1]=temp%10;
next=temp/10;
}
while(next)
{
num[++digit-1]=next%10;
next=next/10;
}
}
printf("%d! = ",n);
for(i=digit; i>=1; i--)
{
printf("%d",num[i-1]);
}
printf("\n");
}
printf("\n");
}
}
动作要快,姿势要帅,闪人:P