#include <stdio.h> #include<stdlib.h>//要使用malloc是要包含此头文件,动态内存分配 #include<math.h> //因为要求的n比较大,所以正常的整数可能是存储不下的。 //所以需要 使用别的方法。 //这里使用的方法就是建立动态数组,数组的每个元素是一个 0-9 的整数。 //比如10!的结果是3628800 这个动态数组里面存储的就是3 6 2 8 8 0 0 int main() { int n; printf("please input n \n"); scanf("%d", &n); if (n <= 1) { printf("error:n<=1"); return 0; } int len = (int)log10(n) * n; //结果长度。这里先计算阶乘的计算结果的位数,这样就可以申请数组了。 if (len == 0) len = n; //我数学也不是很好。这里计算阶乘结果的位数 需要 数学知识。 //这个代码 这里使用的方法 计算出来的位数 是 多了的。最少多0个。 //和基本的动态建立数组的思想是一致的,往多了建。 int* sum = (int*)malloc(len * (sizeof(int))); //这里申请数组了。 for (int i = 0; i < len; i++)//数组赋值 { sum[i] = 0; } //先把数组初始化为0 sum[len - 1] = 1; //最后一位为1 //接下来这一段是具体的计算阶乘,并把结果存储在数组的后面几位。即存储元素是从后往前存储的。 int j; int pre = 0; //递进符号 for (int i = 2; i <= n; i++) //为什么从2开始,因为计算阶乘嘛,1不用乘。 { for (j = len - 1; j >= 0; j--) //这个循环的意思就是用数组的数字 乘以i并加上pre.依次向前,这样可以把超过1位的结果向前传递。 { int temp = pre + sum[j] * i; //进位加这一位该做的计算。 pre = temp / 10; //pre是进位 sum[j] = temp % 10; //sum[j]就是这一位本来该存放的数字。 } } //你看,它把元素存储在数组的后面,前面的为0的会跳过的。 j = 0; while (sum[j] == 0)j++; for (; j < len; j++) { printf("%d", sum[j]); } if (sum != NULL) { free(sum); sum = NULL; } return 0; }