题目:求100!

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

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

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

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

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

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

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

	public static void main(String[] args) throws IOException {
int digit = 1; // 位数
int temp; // 阶乘的任一元素与暂时结果的某位的乘积结果
int i, j, carry; // 进位
boolean isnavigate = false; // 输入的数是正数还是负数
int[] a = new int[3000]; // 确保保存终于运算结果的数组足够大
System.out.println("请输入一个数字,求它的阶乘");
String nStr = ClassicalIOCode.getSystemInput();
int n = 1;
try {
n = Integer.parseInt(nStr);
}catch(NumberFormatException nfe) {
System.out.println("请输入合法的正整数!");
return;
}
if(n < 0) {
n = -n;
isnavigate = true;
}
a[0] = 1; // 将结果先初始化为1
for (i = 2; i <= n; i++) { // 開始阶乘,阶乘元素从2開始依次"登场"
// 按最主要的乘法运算思想(从个位到高位逐位相乘。进位)来考虑,将暂时结果的每位与阶乘元素相乘
for (j = 1, carry = 0; j <= digit; j++) { // carry:进位
temp = a[j - 1] * i + carry; // 对应阶乘中的一项与当前所得暂时结果的某位//相乘(加上进位)
a[j - 1] = temp % 10; // 更新暂时结果的位上信息
carry = temp / 10; // 看是否有进位
}
while (carry != 0) { // 假设有进位
a[++digit - 1] = carry % 10; // 新加一位,加入信息。 位数增1
carry = carry / 10; // 看还能不能进位
}
}
if(isnavigate) {
if(n % 2 == 1) {
System.out.print((-n) + "的阶乘:"+ (-n) +"! = -"); // 显示结果
}else {
System.out.print((-n) + "的阶乘:"+ (-n) +"! = "); // 显示结果
}
}else {
System.out.print(n + "的阶乘:"+ n +"! = "); // 显示结果
}
for (j = digit; j >= 1; j--) {
System.out.print(a[j - 1]);
}
System.out.println();
}

大数问题:求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. Intent跳转到系统应用中的拨号界面、联系人界面、短信界面及其他

    现在开发中的功能需要直接跳转到拨号.联系人.短信界面等等,查找了很多资料,自己整理了一下. 首先,我们先看拨号界面,代码如下: Intent intent =new Intent(); intent. ...

  2. wepy - 与原生有什么不同($pages,$interceptors)

    wepy内部封装的一些基类,我们要注意以 “$”开头命名,最好不用 关于wepy基类文档,请查看 关于$apply,其实就是主动刷新DOM,来更新数据. 何时使用它? 答. 你为data里面的数据进行 ...

  3. 子查询三(在FROM子句中使用子查询)

    FROM子句中使用子查询一般都是返回多行多列,可以将其当作一张数据表 示例一.查询出每个部门的编号,名称,位置,部门人数,平均工资 SELECT d.deptno,d.dname,d.loc,temp ...

  4. 算法笔记_210:第六届蓝桥杯软件类决赛真题(Java语言C组)

    目录 1 机器人数目 2 生成回文数 3 空心菱形 4 奇怪的数列 5 密文搜索 6 居民集会 前言:以下代码仅供参考,若有错误欢迎指正哦~ 1 机器人数目 标题:机器人数目 少年宫新近邮购了小机器人 ...

  5. 算法笔记_118:算法集训之结果填空题集二(Java)

     目录 1 欧拉与鸡蛋 2 巧排扑克牌 3 排座位 4 黄金队列 5 汉诺塔计数 6 猜生日 7 棋盘上的麦子 8 国庆星期日 9 找素数 10 填写算式 11 取字母组成串   1 欧拉与鸡蛋 大数 ...

  6. Openerp 7 view画面编辑/创建/删除/复制功能控制

    OpenERP 7.0中,Tree或Form画面上可以添加属性create edit delete,用于控制Create.Delete.Edit.Duplicate功能是否显现.如下例:<for ...

  7. Loader拉取图片,由于redirect重定向,导致策略文件无效 设置checkPolicyFile后还是无效:需要一个策略文件,但在加载此媒体时未设置 checkPolicyFile 标志

    大家好,在这里分享一下flash里边处理redirect的方法. 一般而言,大家不会遇到这个问题,毕竟图片地址一般杠杠的,不会redirect.但昨天在拉取空间的照片就会出现redirect.神啊!! ...

  8. Unix 网络编程 读书笔记2

    第三章 套接字编程简介 每一个 Socket 都用一个半相关描述:{协议,本地地址,本地端口}一个完整的 Socket 则用一个相关描述{协议,本地地址,本地端口,远程地址,远程端口}每一个 Sock ...

  9. exception PLS-00103: Encountered the symbol "(" when expecting one of the following:

      exception PLS-00103: Encountered the symbol "(" when expecting one of the following: Cre ...

  10. html5 效果 按下鼠标数值自动增长

    <!doctype html> <html> <head> <style> * { margin:0; padding:0; } div { margi ...