Time Limit: 3 second
Memory Limit: 2 MB
对于阶乘函数,即使自变量较小,其函数值也会相当大。例如: 10!=3628800 25!=15511210043330985984000000 若用integer型数据表示阶乘,最多仅可用7!,用longint类型类型亦只能到12!。设计一个程序,当键入一个正整数n(1<=n<=100)时,输出n!的精确值。
如果N的值不在规定的范围,将输出“error”。
Input
输入文件中只一个数字,表示要计算的n的值(1<=n<=100)。
Output
输出N!的精确值
Sample Input
12
Sample Output
12!=479001600
【题解】
高精度*单精度。乘的时候要记录进位信息。然后处理进位即可。不断更新数字的长度。最后倒叙输出
【代码】
#include <cstdio> #include <stdlib.h> const int MAXN = 500; int n,a[MAXN],la = 1; void input_data() //输入数据 { scanf("%d",&n); if ( n<1 || n>100) //输出错误信息 { printf("error"); exit(0); } for (int i = 2; i <= MAXN;i++) a[i] = 0; a[1] = 1; //先置1方便后面乘 } void get_ans() { for (int i = 1;i <= n;i++) //从1 一直 乘到n { int x = 0; for (int j = 1;j <= la;j++) //对现在的数字的每一位都乘上i x用来保存进位信息 { a[j] = a[j] * i + x; x = a[j] / 10; a[j] = a[j] % 10; } while (x > 0) //如果进位数字>0则 数字的位数可以增加 不断增加即可 { la++; a[la] += x; x = a[la] / 10; a[la] = a[la] %10; } } } void output_ans() { printf("%d!=",n); for (int i = la;i >= 1;i--) printf("%d",a[i]); } int main() { input_data(); get_ans(); output_ans(); return 0; }