利用数组计算256的阶乘
2011-05-05 13:16
274 查看
假如我们要精确计算一个很大的数,比如说,256的阶乘(结果有500多位),怎么办?
你会说,很好办啊,从JDK 1.1起Java不是提供了一个java.math.BigInteger吗?不错,用BigInteger确实能解决问题。不过,如果没有Sun给的这个class,仅仅靠Java最基本的那些类型,我们有没有办法来进行计算呢?答案是,肯定是能嘛,要不然在BigInteger之前怎么办。
方法之一就是用数组来表示。比如说:
int[] data = new int[100];
我们知道,一个int的最大值为2^31-1即2147483647(10位),如果我们把这100个int值串起来,我们就能表示一个1000位的数。这里我们就用这种方式来计算256的阶乘(256!)。
我们先分配100个int的数组,由于是static,所以每个int的初始值都是0。
然后每个int表示6位数,即最大值为999999。因为我们要做乘法,如果给int的位数过大,如9位,那么999999999乘上一个数,如100,它的值就大于了int的max值,造成溢出。所以int表示的位数需要根据需要仔细选择。(用long来表示也同样需要仔细权衡位数)
再定义一个num来表示我们占用的数组的int个数
在乘法的时候,对每个占用的int中的数都要乘,然后一个一个地判断每个int中的值是不是超出了6位:
if (data[j]) > 1000000)
如果超出了则需要进位:
data[k+1] += data[k]/1000000;
data[k] %= 1000000;
一个个判断,最后,如果最高位(即data[num])中的数值也超过了6位,我们就需要占用一个新的int,同样地进位,当然也不要忘了给num加一。
if (data[num] > 1000000) num++;
最后,将我们的数组顺序输出即可。在输出的时候需要小心的是,如果int中的值小于6位,如25,别忘了补上0,即000025,否则你会得到错误的答案的。
完整的代码如下:
你会说,很好办啊,从JDK 1.1起Java不是提供了一个java.math.BigInteger吗?不错,用BigInteger确实能解决问题。不过,如果没有Sun给的这个class,仅仅靠Java最基本的那些类型,我们有没有办法来进行计算呢?答案是,肯定是能嘛,要不然在BigInteger之前怎么办。
方法之一就是用数组来表示。比如说:
int[] data = new int[100];
我们知道,一个int的最大值为2^31-1即2147483647(10位),如果我们把这100个int值串起来,我们就能表示一个1000位的数。这里我们就用这种方式来计算256的阶乘(256!)。
我们先分配100个int的数组,由于是static,所以每个int的初始值都是0。
然后每个int表示6位数,即最大值为999999。因为我们要做乘法,如果给int的位数过大,如9位,那么999999999乘上一个数,如100,它的值就大于了int的max值,造成溢出。所以int表示的位数需要根据需要仔细选择。(用long来表示也同样需要仔细权衡位数)
再定义一个num来表示我们占用的数组的int个数
在乘法的时候,对每个占用的int中的数都要乘,然后一个一个地判断每个int中的值是不是超出了6位:
if (data[j]) > 1000000)
如果超出了则需要进位:
data[k+1] += data[k]/1000000;
data[k] %= 1000000;
一个个判断,最后,如果最高位(即data[num])中的数值也超过了6位,我们就需要占用一个新的int,同样地进位,当然也不要忘了给num加一。
if (data[num] > 1000000) num++;
最后,将我们的数组顺序输出即可。在输出的时候需要小心的是,如果int中的值小于6位,如25,别忘了补上0,即000025,否则你会得到错误的答案的。
完整的代码如下:
package tmp; /** * * @author Stevech */ public class BigNumbers { static int[] data = new int[100]; /** Creates a new instance of BigNumers */ public static void main(String[] args) { int num = 0; // 占用的个数 data[0] = 1; // 0和1的阶乘是1 for (int i = 2; i < 257; i++) { for (int j = 0; j < num + 1; j++) { data[j] *= i; // 对每个int中的数都乘上 i } for (int j = 0; j < num + 1; j++) { if (data[j] > 1000000) { for (int k = j; k < num + 1; k++) { if (data[num] > 1000000) num++; data[k+1] += data[k]/1000000; // 进位 data[k] %= 1000000; // 进位后的余数 } } } } System.out.println("占用的int数:" + (num+1) + "/n值:"); System.out.print(data[num]); for (int i = num-1; i > -1; i--) { System.out.print(new java.text.DecimalFormat("000000").format(data[i])); } } }
相关文章推荐
- 利用数组计算n的阶乘(n比较大的情况)和末尾0的个数
- asp利用数组实现阶乘计算(大数相乘)
- 利用数组模拟数字,实现计算大数字阶乘00
- 利用数组实现大数的阶乘
- 蓝桥杯 - 基础练习 阶乘计算 -整数数组 耗时低~可以通过
- 利用递归方法计算 阶乘
- Numpy基础 --数组和矢量计算 利用Python进行数据分析读书笔记
- 利用数组模拟栈实现简单的表达式中缀转后缀并进行计算
- 第5章 数组 上机实验(2) 利用二维数组学生平均分计算以及课程平均分计算
- 利用递归计算N的阶乘
- 利用Map特性计算数组中元素重复出现的次数
- 7.计算阶乘(数组中元素的积)
- 利用函数重载分别创建三个函数,分别是计算2个数的和,3个数的和,4个数的和/利用函数重载分别创建三个函数,分别计算int类型数组中最大值,stirng 类型数组中最长的字符串,double类型数组中最
- 利用c语言计算n的阶乘及其求和(多种方法)
- 蓝桥杯(java)阶乘计算,输入一个正整数n,输出n!的值。(高精度计算,用到数组)
- ACM--再说利用数组存储计算过程对程序效率带来的好处
- 数组计算阶乘
- 利用静态变量计算n的阶乘
- 利用静态变量计算n的阶乘
- 用数组创建一个栈(stack),并利用栈来计算后缀表达式的值