题目:求100!

这看起来是一个非常简答的问题,递归解之毫无压力

  1. int func(int n){
  2. if(n <= 1) return 1;
  3. else return n*func(n-1);
  4. }

但你会发现,题目真的有这么简单吗,考虑整形数据越界没有?

这实际上是一个大数问题!

大数怎么表示呢,非常直接的。我们会想到用字符串来表示。但表示的过程中还得做阶乘运算。是不是想象的那么复杂呢?

事实上。用主要的乘法运算思想(从个位到高位逐位相乘,进位)来考虑,将暂时结果的每位与阶乘元素相乘。向高位进位。问题并非那么复杂。

代码中凝视非常具体,不多说,直接贴在以下了。

  1. public static void main(String[] args) throws IOException {
  2. int digit = 1; // 位数
  3. int temp; // 阶乘的任一元素与暂时结果的某位的乘积结果
  4. int i, j, carry; // 进位
  5. boolean isnavigate = false; // 输入的数是正数还是负数
  6. int[] a = new int[3000]; // 确保保存终于运算结果的数组足够大
  7. System.out.println("请输入一个数字,求它的阶乘");
  8. String nStr = ClassicalIOCode.getSystemInput();
  9. int n = 1;
  10. try {
  11. n = Integer.parseInt(nStr);
  12. }catch(NumberFormatException nfe) {
  13. System.out.println("请输入合法的正整数!");
  14. return;
  15. }
  16. if(n < 0) {
  17. n = -n;
  18. isnavigate = true;
  19. }
  20. a[0] = 1; // 将结果先初始化为1
  21. for (i = 2; i <= n; i++) { // 開始阶乘,阶乘元素从2開始依次"登场"
  22. // 按最主要的乘法运算思想(从个位到高位逐位相乘。进位)来考虑,将暂时结果的每位与阶乘元素相乘
  23. for (j = 1, carry = 0; j <= digit; j++) { // carry:进位
  24. temp = a[j - 1] * i + carry; // 对应阶乘中的一项与当前所得暂时结果的某位//相乘(加上进位)
  25. a[j - 1] = temp % 10; // 更新暂时结果的位上信息
  26. carry = temp / 10; // 看是否有进位
  27. }
  28. while (carry != 0) { // 假设有进位
  29. a[++digit - 1] = carry % 10; // 新加一位,加入信息。
  30.  
  31. 位数增1
  32. carry = carry / 10; // 看还能不能进位
  33. }
  34. }
  35. if(isnavigate) {
  36. if(n % 2 == 1) {
  37. System.out.print((-n) + "的阶乘:"+ (-n) +"! = -"); // 显示结果
  38. }else {
  39. System.out.print((-n) + "的阶乘:"+ (-n) +"! = "); // 显示结果
  40. }
  41. }else {
  42. System.out.print(n + "的阶乘:"+ n +"! = "); // 显示结果
  43. }
  44. for (j = digit; j >= 1; j--) {
  45. System.out.print(a[j - 1]);
  46. }
  47. System.out.println();
  48. }

大数问题:求n的阶乘的更多相关文章

  1. 汇编语言-求X的阶乘

    1. 题目:求X的阶乘值 2. 要求:输入一个整型数(不超过10),求出其阶乘值后输出,求阶乘的算法用子程序来实现. 3. 提示:可以用递归来实现,也可以用简单的循环来实现. 这里使用循环来实现: 对 ...

  2. C语言-求1-20的阶乘的和(函数的递归)

    // //  main.c //  C语言 // //  Created by wanghy on 15/9/5. //  Copyright (c) 2015年 wanghy. All rights ...

  3. 递归和非递归分别实现求n的阶乘

    思路:举例求6的阶乘,6*5*4*3*2*1.可以将5开始看成另一个整型变量n,用一个循环每次将n的值减少1,.而递归也是如此,每次调用函数的时候将变量减一就可以. 方法一:非递归 //非递归: #i ...

  4. 求N的阶乘N!中末尾0的个数

    求N的阶乘N!中末尾0的个数 有道问题是这样的:给定一个正整数N,那么N的阶乘N!末尾中有多少个0呢?例如:N=10,N=3628800,则N!的末尾有两个0:直接上干货,算法思想如下:对于任意一个正 ...

  5. 2717: 递归函数求n的阶乘

    2717: 递归函数求n的阶乘 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 1329  Solved: 942[Submit][Status][Web ...

  6. 求n的阶乘!

    编写一个computer类,类中含有一个求n的阶乘的方法,将该类打包, 在另一个包中引入包,在主类中定义computer类的对象,调用求n的阶乘的方法,并输出结果 结果

  7. 题目一:编写一个类Computer,类中含有一个求n的阶乘的方法

    作业:编写一个类Computer,类中含有一个求n的阶乘的方法.将该类打包,并在另一包中的Java文件App.java中引入包,在主类中定义Computer类的对象,调用求n的阶乘的方法(n值由参数决 ...

  8. POJ 1401:Factorial 求一个数阶乘的末尾0的个数

    Factorial Time Limit: 1500MS   Memory Limit: 65536K Total Submissions: 15137   Accepted: 9349 Descri ...

  9. HDU 1018 大数(求N!的位数/相加)

    Big Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

随机推荐

  1. MongoDB社区版本和企业版本差别

    MongoDB社区版本和企业版本差异主要体现在安全认证.系统认证等方面,具体信息参考下表: 版本特性 社区版本 企业版本 JSON数据模型.自由模式 支持 支持 水平扩展的自动分片功能 支持 支持 内 ...

  2. Linux命令行和Shell高效率使用方法

    Ctrl+R快速搜索history Ctrl+P显示上一条命令 快速执行一条history命令:!!/!-number ======================================== ...

  3. PHP高级教程-高级过滤器

    PHP 高级过滤器 检测一个数字是否在一个范围内 以下实例使用了 filter_var() 函数来检测一个 INT 型的变量是否在 1 到 200 内: 实例 <?php $int = 122; ...

  4. Java从零开始学三十七(JAVA IO- 二进制文件读写)

    一.简述 二.使用步骤 DataInputStream: 引入相关的类 构造数据输入流的对象(如:FileInputStream,BufferedWriter包装后读取文件等) 读取二进制文件的数据 ...

  5. 分离链接散列表C语言实现实例

    /* hash_sep.h */ #ifndef _HASH_SEP_H #define _HASH_SEP_H #define MIN_TABLE_SIZE 5 struct list_node; ...

  6. RAM调优之日志分析

    D/dalvikvm: <GC_Reason> <Amount_freed>, <Heap_stats>, <External_memory_stats> ...

  7. DIY手机万能红外遥控器

    DIY手机万能红外遥控器 1.手机安装软件:遥控精灵 2.红外二极管两个(旧的遥控器里面可以拆) 3.耳机的插头一个 步骤:首选讲两个二极管的正负相接(即a二极管的正极连接b二极管的负极,a二极管的负 ...

  8. scala中:: , +:, :+, :::, +++的区别

    4种操作符的区别和联系 一. ::   该方法被称为cons,意为构造,向队列的头部追加数据,创造新的列表. 用法为 x::list,其中x为加入到 头部的元素,无论x是列表与否,它都只将成为新生成列 ...

  9. JavaScript实现碰撞检测(分离轴定理)

    概述 分离轴定理是一项用于检测碰撞的算法.其适用范围较广,涵盖检测圆与多边形,多边形与多边形的碰撞:缺点在于无法检测凹多边形的碰撞.本demo使用Js进行算法实现,HTML5 canvas进行渲染. ...

  10. 訪问可能没有定义的data (通过static类型flash.net:FileReference引用)

    今天使用Flex实现了图片预览及其上传的功能,在整个开发过程中遇到了"訪问可能没有定义的data (通过static类型flash.net:FileReference引用)"错误, ...