1 条题解
-
2
难度:适中?!
(不看标签『高精度』的屑甚至尝试用 long long 解题,却接连败北。。)考察点:高精度加法 高精度乘法 不会的遇见这种题不若弃了罢………………
#include<cstdio> #include<cstring> using namespace std; int a[101]={0, 1}; //a:[1, 101]倒序存储单次运算结果,初始值为 1 int b[101]; //b:[1, 101]倒序存储累计运算结果,初始值为 0 int main(){ int n; scanf("%d", &n); int l=1, x=0, t=0; //x、t:进位标记,初始值为 0 l:存储运算结果长度,初始值为 1(最高位) for(int i=1; i<=n; i++){ for(int j=1; j<=l; j++){ //a[j] = a[j]*i(阶乘数据)+x(进位) a[j] *= i; a[j] += x; //进位 = a[j] 除个位以外的其余数字 x = a[j]/10; //a[j]%10 只保留个位数字,其余进位 a[j] %= 10; if(x && j>=l){ //进位不为 0 且 j 长度不小于 l(最高位进位) l++; //运算结果长度加 1 } } x = 0; //进位标记,重新赋值为 0 for(int j=1; j<=l; j++){ b[j] += a[j]+t; //b[j] = a[j]+b[j]+t t = 0; //进位标记,重新赋值为 0 if(b[j] > 9){ // b[j]>9:存在进位 t = b[j]/10; //进位 = b[j] / 10 b[j] %= 10; //删除超出存储范围的部分 } } if(t){ //加法运算进位 b[l+1] = t; t = 0; //进位标记,重新赋值为 0 } } if(b[l+1]) printf("1"); //存在加法运算进位,输出前置 1 for(int i=l; i>0; i--){ printf("%d", b[i]); //正序输出运算结果 a } printf("\n"); //换行符 return 0; }
- 1
信息
- ID
- 1549
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 7
- 标签
- 递交数
- 31
- 已通过
- 9
- 上传者