【题目链接】

ybt 1172:求10000以内n的阶乘
OpenJudge NOI 1.6 14:求10000以内n的阶乘

【题目考点】

1. 高精度

考察:高精乘低精
高精度计算讲解

【解题思路】

先求结果最大的位数,也就是10000!10000!10000!的位数。
已知某正整数x的的位数为n,那么有:n=⌊lgx⌋+1n = \lfloor lgx \rfloor + 1n=⌊lgx⌋+1(lgxlgxlgx:以10为底x的对数)
位数为⌊lg10000!⌋+1≤⌊lg1000010000⌋+1=⌊10000⋅lg10000⌋+1=⌊10000∗4⌋+1=40001\lfloor lg10000! \rfloor + 1\le \lfloor lg10000^{10000} \rfloor + 1=\lfloor 10000\cdot lg10000 \rfloor + 1=\lfloor 10000*4 \rfloor + 1 = 40001⌊lg10000!⌋+1≤⌊lg1000010000⌋+1=⌊10000⋅lg10000⌋+1=⌊10000∗4⌋+1=40001
数字数组长度取40005即可。
由于求10000的阶乘,每次乘的数字都是小于等于10000的数字,为低精度数字。阶乘的结果为高精度数字。所以应该使用高精乘低精。如果使用高精乘高精,算法复杂度会增大,可能会超时。

【题解代码】

解法1:使用函数与数组

#include <bits/stdc++.h>
using namespace std;
#define N 40005
void setLen(int a[], int i)
{while(a[i] == 0 && i > 1)//去除多余的0i--;a[0] = i;
}
void Multiply(int a[], int b)//a *= b 高精乘低精
{int c = 0, i;for(i = 1; i <= a[0]; ++i){a[i] = a[i]*b + c;c = a[i] / 10;a[i] %= 10; }while(c > 0){a[i] = c % 10;c /= 10;i++;}setLen(a, i);
}
void toNum(char s[], int a[])
{a[0] = strlen(s);for(int i = 1; i <= a[0]; ++i)a[i] = s[a[0] - i] - '0';
}
void showNum(int a[])
{for(int i = a[0];i >= 1;--i)cout << a[i];
}
int main()
{int a[N] = {1, 1}, n;//高精度数字a初值为1 cin >> n;for(int i = 1; i <= n; ++i)Multiply(a, i);showNum(a);return 0;
}

解法2:类中重载运算符

#include <bits/stdc++.h>
using namespace std;
#define N 40005
struct HPN
{int a[N];//数字数组HPN(){memset(a, 0, sizeof(a));}HPN(char s[]){memset(a, 0, sizeof(a));int len = strlen(s);for(int i = 0; i < len; ++i)a[len - i] = s[i] - '0';a[0] = len;}void setLen(int i){while(a[i] == 0 && i > 1)//去除多余的0i--;a[0] = i;}void operator *= (int b)//a *= b 高精乘低精{int c = 0, i;for(i = 1; i <= a[0]; ++i){a[i] = a[i]*b + c;c = a[i] / 10;a[i] %= 10; }while(c > 0){a[i] = c % 10;c /= 10;i++;}setLen(i);}void show(){for(int i = a[0]; i >= 1; --i)cout << a[i];}
};
int main()
{HPN a("1");//高精数字a初值为1 int n;cin >> n;for(int i = 1; i <= n; ++i)a *= i;//高精乘低精a.show();return 0;
}

信息学奥赛一本通 1172:求10000以内n的阶乘 | OpenJudge NOI 1.6 14:求10000以内n的阶乘相关推荐

  1. 信息学奥赛一本通 1112:最大值和最小值的差 | OpenJudge NOI 1.9 05

    [题目链接] ybt 1112:最大值和最小值的差 OpenJudge NOI 1.9 05:最大值和最小值的差 [题目考点] 1. 求数组中最大值及其下标 方法1:保存最大值和下标 设置临时最大值变 ...

  2. 信息学奥赛一本通 1170:计算2的N次方 | OpenJudge NOI 1.6 12:计算2的N次方

    [题目链接] ybt 1170:计算2的N次方 OpenJudge NOI 1.6 12:计算2的N次方 [题目考点] 1. 高精度 考察:高精乘低精 高精度计算讲解 2. 快速幂 [解题思路] 先估 ...

  3. 信息学奥赛一本通 1411:区间内的真素数 | OpenJudge NOI 1.13 23:区间内的真素数

    [题目链接] ybt 1411:区间内的真素数 OpenJudge NOI 1.13 23:区间内的真素数 [题目考点] 1. 质数 2. 数字拆分 [解题思路] 设函数判断一个数是否是质数 设函数求 ...

  4. 信息学奥赛一本通 1405:质数的和与积 | OpenJudge NOI 2.1 7827:质数的和与积 | 小学奥数 7827

    [题目链接] ybt 1405:质数的和与积 OpenJudge NOI 2.1 7827:质数的和与积 OpenJudge NOI 小学奥数 7827:质数的和与积 [题目考点] 1. 枚举 [解题 ...

  5. 信息学奥赛一本通 1147:最高分数的学生姓名 | OpenJudge NOI 1.9 02:输出最高分数的学生姓名

    [题目链接] ybt 1147:最高分数的学生姓名 OpenJudge NOI 1.9 02:输出最高分数的学生姓名 [题目考点] 1. 结构体 2. 求最大值下标 [题解代码] 解法1:用结构体 设 ...

  6. 信息学奥赛一本通 1071:菲波那契数 | OpenJudge NOI 1.5 17:菲波那契数列

    [题目链接] ybt 1071:菲波那契数 OpenJudge NOI 1.5 17:菲波那契数列 [题目考点] 1. 斐波那契数列 参考:多种方法求斐波那契数列 [解题思路] 迭代法求斐波那契数列 ...

  7. 信息学奥赛一本通 1016:整型数据类型存储空间大小 | OpenJudge NOI 1.2 01

    [题目链接] ybt 1016:整型数据类型存储空间大小 OpenJudge NOI 1.2 01:整型数据类型存储空间大小 [题目考点] 1. sizeof运算符 sizeof可以求某常量.变量或类 ...

  8. 信息学奥赛一本通 1014:与圆相关的计算 | OpenJudge NOI 1.3 09

    [题目链接] ybt 1014:与圆相关的计算 OpenJudge NOI 1.3 09:与圆相关的计算 [题目补充] OpenJudge中有提示,本题中圆周率只能取3.14159,这一点在ybt中没 ...

  9. 信息学奥赛一本通 1245:不重复地输出数 | OpenJudge NOI 1.11 08:不重复地输出数

    [题目链接] ybt 1245:不重复地输出数 OpenJudge NOI 1.11 08:不重复地输出数 [题目考点] 1. 二分查找 2. 复杂度为O(nlogn)的排序 快速排序:时间复杂度O( ...

最新文章

  1. 《愤怒的小鸟》对移动互联网经营的启示
  2. review——C# (6)虚方法和覆写方法
  3. Python进阶07 函数对象
  4. sql 合并行内容_SAS高级编程公开课之一SQL
  5. 数组指针——指向数组的指针(通过指针控制数组)
  6. shell脚本自动备份MySQL数据库
  7. ContextLoaderListener的作用详解
  8. Linux学习总结(七十四)自动化运维之ansible
  9. paip.验证码识别---初始化
  10. vpx计算机论文,高端计算机系统架构设计与VPX总线
  11. 计算机应用软件论文范文,计算机论文范文大全集(计算机应用论文范文5000字)
  12. gromacs 安装_Gromacs详细安装教程
  13. 小米r2d做nas_零基础也可以打造智能家居,利用群晖docker将小米全家桶接入ios Homekit...
  14. docker cp传递整个目录
  15. SIMetrix教程-008.死区时间;Dead time
  16. 这篇 Linux 总结的很棒啊!
  17. 转载Python正则表达式匹配反斜杠'\'问题(——字符串转义与正则转义)
  18. Typora字体排版
  19. 中南大学计算机控制试卷,中南大学计算机控制新版系统复习题及答案.doc
  20. java取拼音首字母_java怎么根据汉字获取字的拼音首字母

热门文章

  1. ArcGIS Server 10 for java 注册SOE出现的问题
  2. repeater的嵌套(转+总结)[http://www.cnblogs.com/esshs/archive/2005/04/07/132825.html]
  3. 零基础科普:4种简单推荐算法背后的原理
  4. 什么是PostgreSQL?跟MySQL、Oracle比强在哪?
  5. 大数据如何促进经济增长?中国优势及应对 | 互联网经济学
  6. 2017互联网技术人薪资报告,你搬的砖够绕地球几圈?
  7. 乖乖,腾讯天美研发20万月薪刷爆朋友圈,网友:小丑竟是我自己
  8. 我手撸了一个划线翻译工具!
  9. 每一个都能笑抽,39个奇葩代码注释
  10. 抗击肺炎,中国互联网公司在行动