N!

Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)
Total Submission(s): 86835    Accepted Submission(s): 25542

Problem Description
Given an integer N(0 ≤ N ≤ 10000), your task is to calculate N!
Input
One N in one line, process to the end of file.
Output
For each N, output N! in one line.
Sample Input
1 2 3
Sample Output
1 2 6


问题链接:HDU1042 n!。

问题描述:参见上文。

问题分析

  看似简单的问题,背后实际上有许多道理。

  阶乘值随着n的增大,增大的速度相当的快,是一个大整数。似乎这个题可以使用大整数类进行计算,然而类计算相对复杂,时间上溢出的可能性比较大。一般的整数计算,在计算机中是一种相对比较快的运算。

  用10000进制(万进制)来计算是一个有效的办法。10000进制的数可以放进数组中,每个元素放1位。人们通常使用10进制,采用逢10进1。采用10000进制的话,就是逢10000进1了。

  为什么采用10000进制而不采用其他的进制?原因还是有几点的,一是计算结果输出时相对比较方便;二是C语言或C++语言的整数类型在不同的编译运行环境中,其值范围是不一样的,一般整数类型int至少是16位的,其值>30000,采用10000进制是一种保守的做法。

  实际上,目前绝大多数计算机是64位的,使用更高的进制(例如100000000,亿进制)进行计算效率会更高。

  这个题计算的是阶乘,只需要单一的乘法运算,计算逻辑并不复杂,对于10000进制逻辑实现上不是问题。

  程序里的数组,下标小的放的是低位,下标大的放高位。

程序说明:(略)。

AC的C语言程序如下:

/* HDU1042 n! */#include <stdio.h>void factorial(int n)
{int a[10000 + 1] = {1};int digits=1/*10000进制的位数*/, carry, i, j;for(i=2;i<=n;i++){carry = 0;   //进位for(j=0; j<digits; j++){a[j] = a[j] * i + carry;carry = a[j] / 10000;a[j] %= 10000;}if(carry>0)  // 最高位的进位a[digits++] = carry;}// 输出:高位原样输出,低位的高位补0printf("%d", a[digits-1]);for(i=digits-2; i>=0; i--)printf("%04d", a[i]);printf("\n");
}int main()
{int n;while(scanf("%d", &n) != EOF)factorial(n);return 0;
}

HDU1042 n!【大数+万进制】相关推荐

  1. UVA495 Fibonacci Freeze【大数+万进制】

    The Fibonacci numbers (0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, ...) are defined by the recurrence: F0 = ...

  2. 大数系列三——斐波那契数列——高效万进制,亿进制

    浅谈万进制思想: 日常生活中我们习惯用十进制去运算: 为了方便电脑识别开发出了二进制,又因为2^3=8 , 2^4=16,因此应运而生了八进制与16进制. 世上本没有路,走的人多了,也便成了路,那么既 ...

  3. 高效万进制——蓝桥杯|HDOJ 1002 大数加法——30行代码AC

    浅谈进制思想: 日常生活中我们习惯用十进制去运算: 为了方便电脑识别开发出了二进制,又因为2^3=8 , 2^4=16,因此应运而生了八进制与16进制. 世上本没有路,走的人多了,也便成了路,那么既然 ...

  4. 万进制——蓝桥杯|ACM 大数阶乘——21行代码AC

    浅谈进制思想: 日常生活中我们习惯用十进制去运算: 为了方便电脑识别开发出了二进制,又因为2^3=8 , 2^4=16,因此应运而生了八进制与16进制. 世上本没有路,走的人多了,也便成了路,那么既然 ...

  5. 【C语言数据结构与算法的应用4】巨大数----加减乘运算(万进制和Mec补码的应用)

    巨大数 什么是巨大数 目的 巨大数的加法 巨大数的存储 万进制 微易码补码 巨大数的减法 巨大数的乘法 总结 什么是巨大数 巨大数其实就是有效数字位很大,可表示数的大小超过了int 的表示范围:[-2 ...

  6. LQ0262 棋盘放麦子【大数+亿进制】

    题目来源:蓝桥杯2012初赛 Java C组C题 题目描述 本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可. 你一定听说过这个故事.国王对发明国际象棋的大臣很佩服,问他要什么报 ...

  7. 浅谈万进制算法与大数定理的结合(高精度乘除法,阶乘)

    我们经常用的进制就是2进制.8进制.10进制和16进制.何来"万进制"?世上本无,有人喊了也就有了.呵呵 现在来谈谈自己对进制的一点不成熟的想法.计算机能"识别" ...

  8. 1000的阶乘-HDU 1042-大数阶乘(万进制思想)

    思路: 即用数组a,数组中的每个元素存储4位数,, 比如,计算9的阶乘,在计算到7的阶乘时,7!为5040,可以用a[0]存储5040,没有产生进位,然后8!=5040*8=40320,如果看成万进制 ...

  9. (大数)进制转换 —— 16、8进制转换成2进制

    (大数)进制转换 --16.8进制转2进制 16进制转2进制示例代码: #include <iostream> using namespace std; int main(){string ...

最新文章

  1. Python与redis集群进行交互操作
  2. oracle创建带参数视图6,Oracle创建带有参数的视图代码介绍
  3. 修改sublime列编辑快捷键
  4. 你知道这 8 种 SQL 错误用法吗?
  5. SAP CRM WebClient UI element id generation logic
  6. github设置仓库可见性 私人仓库设置
  7. 怎么清空topic数据_20.Roscpp/Rospy:Topic_demo
  8. java public object_Java中Object类
  9. 离线处理需要做哪些工作_游戏配音需要做哪些工作?
  10. win10系统中photoshop cs6中界面字体太小的解决方法
  11. OpenSSL 介绍和使用
  12. springboot获取active_springboot 2.3.0+activeRecord获取对象报类型转换错误
  13. Cisco 防火墙 SSH配置
  14. 大数据对人们生活的积极影响_大数据对生活带来的影响
  15. 极大似然估计法的理解和用途
  16. Windows XP/2003系统服务优化
  17. UVM验证平台搭建三:spi_mst_agent-spi_slv_agent
  18. Adobe Lightroom Classic 2021(LR 2021)照片编辑软件
  19. 西门子1200 1500 完整大型PLC程序 3台西门子触 摸屏 程序块无密码 结构清晰 程序带中文注解 共1多台发那科机器人
  20. openbmc中关于invalid authentication algorithm问题

热门文章

  1. SVN Cleanup失败解决方法
  2. DXUT框架剖析(2)
  3. linux部署多个jar 会宕机_我常用的自动化部署技巧,贼好用,推荐给大家!
  4. 我的世界基岩版json_我的世界基岩版app_我的世界基岩版app下载_我的世界基岩版安卓版下载-新手游网...
  5. scala中的match
  6. Python数据结构实战——双向链表(DoublyLinkedList)
  7. Sklearn——用Sklearn实现K近邻分类(KNN)
  8. 多线程—— Queue(储存进程结果)
  9. caffe和caffe-yolov3编译出错:fatal error: caffe/proto/caffe.pb.h: No such file or directory
  10. MapWinGis入门