Just Java IT

西门町学士关于Java的随便一说而已……

数组的力量

    假如我们要精确计算一个很大的数,比如说,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,否则你会得到错误的答案的。
    完整的代码如下:

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]));
        }
    }
}
输出结果为:
占用的int数:85
值:
85781777534284265411908227168123262515778152027948561985965565037726945255314
75893774402913604514084503758853423365843061571968346936964753222892884974260256
79637332563368786442675207626794560187968867971521143307702077526646451464709187
32610083287632570281898077367178145417025052301860849531906813825748107025281755
94594769870346657127381392862052347568082188607012036110831520935019474371091017
26968262861606263662435022840944191408424615936000000000000000000000000000000000
000000000000000000000000000000

posted on 2006-04-16 21:19 西门町学士 阅读(1936) 评论(3)  编辑  收藏 所属分类: Java

Feedback

# re: 数组的力量 2006-04-16 23:49 黑蝙蝠

好贴 呵呵 以前一直在寻找类型题型的解法!  回复  更多评论   

# re: 数组的力量 2006-04-17 02:07 haha

你的上面显示的是不是以10000000为权的值,而不是以10为权的值  回复  更多评论   

# re: 数组的力量 2006-04-17 19:59 西门町学士

最终的结果是十进制的。  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航: