8.17(选做)挑战类型表示的极限——大数的存储问题。编程计算并输出1~40之间的所有数的阶乘。提示:用一个包含50个元素的数组存储一个大数,每个数组元素存储大数中的一位数字
此题为中难题,可参考提示部分,请阅读后充分掌握。
输入
一个不大于40的正整数n
输出
输出1~n所有的阶乘
样例
标准输入 复制文本 |
21 |
标准输出 复制文本 |
1! = 1 2! = 2 3! = 6 4! = 24 5! = 120 6! = 720 7! = 5040 8! = 40320 9! = 362880 10! = 3628800 11! = 39916800 12! = 479001600 13! = 6227020800 14! = 87178291200 15! = 1307674368000 16! = 20922789888000 17! = 355687428096000 18! = 6402373705728000 19! = 121645100408832000 20! = 2432902008176640000 21! = 51090942171709440000 |
标准输入 复制文本 |
40 |
标准输出 复制文本 |
1! = 1 2! = 2 3! = 6 4! = 24 5! = 120 6! = 720 7! = 5040 8! = 40320 9! = 362880 10! = 3628800 11! = 39916800 12! = 479001600 13! = 6227020800 14! = 87178291200 15! = 1307674368000 16! = 20922789888000 17! = 355687428096000 18! = 6402373705728000 19! = 121645100408832000 20! = 2432902008176640000 21! = 51090942171709440000 22! = 1124000727777607680000 23! = 25852016738884976640000 24! = 620448401733239439360000 25! = 15511210043330985984000000 26! = 403291461126605635584000000 27! = 10888869450418352160768000000 28! = 304888344611713860501504000000 29! = 8841761993739701954543616000000 30! = 265252859812191058636308480000000 31! = 8222838654177922817725562880000000 32! = 263130836933693530167218012160000000 33! = 8683317618811886495518194401280000000 34! = 295232799039604140847618609643520000000 35! = 10333147966386144929666651337523200000000 36! = 371993326789901217467999448150835200000000 37! = 13763753091226345046315979581580902400000000 38! = 523022617466601111760007224100074291200000000 39! = 20397882081197443358640281739902897356800000000 40! = 815915283247897734345611269596115894272000000000 |
提示
此题较难,给出代码提示:
#include <stdio.h>
#include <stdlib.h>
#define SIZE 51
int main(void)
{
int data[SIZE] = {0};/* 存储50位数,元素全部初始化为0,不使用data[0] */
int index = 1; /* 数组元素个数,表示阶乘值的位数 */
int n; /* 准备计算的阶乘中的最大数 */
int i, j, k;
data[1] = 1; /* 初始化,令1!=1 */
//printf("Input n:");
scanf("%d", &n);
for (i=1; i<=n; i++) /* 计算从1到n之间所有数的阶乘值 */
{
for (j=1; j<=index; j++) /* 计算阶乘i! */
{
data[j] = data[j] * i;/* 每一位数字都乘以i */
}
for (k=1; k<index; k++)
{
if (data[k] >= 10) /* 阶乘值的每位数字应在0~9之内,若>=10,则进位 */
{
data[k+1] = data[k+1] + data[k]/10; /* 当前位向前进位 */
data[k] = data[k] % 10; /* 进位之后的值 */
}
}
/* 单独处理最高位,若计算之后的最高位>=10,则位数index加1 */
while (data[index] >= 10 && index <= SIZE-1)
{
data[index+1] = data[index] / 10; /* 向最高位进位 */
data[index] = data[index] % 10; /* 进位之后的值 */
index++; /* 位数index加1 */
}
if (index <= SIZE-1) /* 检验数组是否溢出,若未溢出,则打印阶乘值 */
{
printf("%d! = ", i);
for (j=index; j>0; j--) /* 从最高位开始打印每一位阶乘值 */
{
printf("%d", data[j]);
}
printf("\n");
}
else /* 若大于50,数组溢出,则提示错误信息 */
{
printf("Over flow!\n");
exit(1);
}
}
return 0;
}