大数问题:求n的阶乘
题目:求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的阶乘的更多相关文章
- 汇编语言-求X的阶乘
1. 题目:求X的阶乘值 2. 要求:输入一个整型数(不超过10),求出其阶乘值后输出,求阶乘的算法用子程序来实现. 3. 提示:可以用递归来实现,也可以用简单的循环来实现. 这里使用循环来实现: 对 ...
- C语言-求1-20的阶乘的和(函数的递归)
// // main.c // C语言 // // Created by wanghy on 15/9/5. // Copyright (c) 2015年 wanghy. All rights ...
- 递归和非递归分别实现求n的阶乘
思路:举例求6的阶乘,6*5*4*3*2*1.可以将5开始看成另一个整型变量n,用一个循环每次将n的值减少1,.而递归也是如此,每次调用函数的时候将变量减一就可以. 方法一:非递归 //非递归: #i ...
- 求N的阶乘N!中末尾0的个数
求N的阶乘N!中末尾0的个数 有道问题是这样的:给定一个正整数N,那么N的阶乘N!末尾中有多少个0呢?例如:N=10,N=3628800,则N!的末尾有两个0:直接上干货,算法思想如下:对于任意一个正 ...
- 2717: 递归函数求n的阶乘
2717: 递归函数求n的阶乘 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 1329 Solved: 942[Submit][Status][Web ...
- 求n的阶乘!
编写一个computer类,类中含有一个求n的阶乘的方法,将该类打包, 在另一个包中引入包,在主类中定义computer类的对象,调用求n的阶乘的方法,并输出结果 结果
- 题目一:编写一个类Computer,类中含有一个求n的阶乘的方法
作业:编写一个类Computer,类中含有一个求n的阶乘的方法.将该类打包,并在另一包中的Java文件App.java中引入包,在主类中定义Computer类的对象,调用求n的阶乘的方法(n值由参数决 ...
- POJ 1401:Factorial 求一个数阶乘的末尾0的个数
Factorial Time Limit: 1500MS Memory Limit: 65536K Total Submissions: 15137 Accepted: 9349 Descri ...
- HDU 1018 大数(求N!的位数/相加)
Big Number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
随机推荐
- jsAnim简单使用教程
引入jsAnim.js 定义动画元素 元素需要有position:relative;或者position:absolute;属性 添加js <!DOCTYPE HTML> <html ...
- SqlServer日常积累(一)
1. 将一个表的数据插入另一个表 情况一:目标表已存在 (1)如果2张表的字段一致,并且希望插入全部数据,可以用这种方法: Insert Into 目标表 Select * From 来源表; --例 ...
- c语言中static、extern、void的重载
static: 1.在函数内部,表示该变量的值在各个调用间一直保持延续性: 2.在函数这一级,表示该函数只对本文件可见. extern: 1.用于函数定义,表示全局可见(属于冗余的): ...
- [转]自定义Drawable实现灵动的红鲤鱼动画(下篇)
小鱼儿 上篇文章自定义Drawable实现灵动的红鲤鱼动画(上篇)我们绘制了可以摆动身体的小鱼,本篇就分享一下如何让小鱼游到手指点击的位置.用到的主要技术如下: 1).三阶贝塞尔曲线 2).Pat ...
- jquery.dataTables动态列
jquery.dataTables 版本1.10.7 直接上代码: 0.table <table id="popReportTable"> <thead> ...
- Java中的软(弱)引用
一.Java中的强.软.弱.虚引用 在JDK中我们能够看到有一个java.lang.ref的包.这个包中就是Java中实现强.软.弱.虚引用的包,例如以下: PhantomReference 虚引用: ...
- quartz实现定时任务调度
一. 业务需求: 实际工作中我们一般会遇到这种需求: 使用Ajax技术每隔几秒从缓存或数据库中读取一些数据, 然后再显示在页面上, 眼下有一个比較好的定时调度框架: quartz能够满足我们的需求. ...
- jquery动态修改div高度
<!DOCTYPE html> <html> <head> <script src="jquery-1.4.2.min.js">&l ...
- Openerp 7.0消息推送
在一个文档的state变化时,需要将变化情况告知关注用户,通过研究account.invoice的代码,发现是经过如下过程实现此功能的: 1.添加一个消息阶段: <record id=" ...
- Redis学习(5)-Jedis(Java操作redis数据库技术)
Java连接redis 一,导入jar包 Redis有什么命令,Jedis就有什么方法 设置防火墙 在Linux上面运行如下代码: 单实例:Jedis实例: package com.jedis.dem ...