在C語言中我們經常用數組處理大數問題,在java中數組功能逐漸被ArrayList類代替,強大的ArrayList類提供了clear(),equals()等32個方法,所以我們能輕松實現各種類的構造,以下代碼將提供VeryLongInt類的設計:
[java]
- import java.util.ArrayList;
- import java.util.Collections;
-
- class VeryLongInt{
- ArrayList digits; //digits字段,存放大數的各位數字
- public VeryLongInt(){
- final int INITIAL_CAPACITY = 500;
- this.digits = new ArrayList(INITIAL_CAPACITY);
- };//無參構造
-
- public VeryLongInt(String s){
- this.digits = new ArrayList(s.length());
- for(int i =0; i<s.length();i++){
- char c=s.charAt(i);
- if(c>='0' && c<='9'){
- this.digits.add(new Integer(c - '0'));
- }
- }
- };//含參構造
-
- public String toString(){
- StringBuffer s = new StringBuffer("");
- for(int i=0;i<this.digits.size();i++)
- s.append(this.digits.get(i));
- return s.toString();
- }//將大數轉為字符串形式
-
- public void add(VeryLongInt otherVeryLong){
- int largerSize,partialSum,carry=0;
- VeryLongInt sum = new VeryLongInt();
- largerSize = this.digits.size()>otherVeryLong.digits.size() ? this.digits.size():otherVeryLong.digits.size();
- for(int i=0;i<largerSize;i++){
- partialSum = this.least(i)+otherVeryLong.least(i)+carry;
- carry = partialSum / 10;
- sum.digits.add(new Integer(partialSum%10));
- }
- if (carry == 1)
- sum.digits.add(1);
- Collections.reverse(sum.digits); //反轉sum
- this.digits.clear();
- this.digits = sum.digits;
- }//大數加法
-
- public void mult(VeryLongInt otherVeryLong){
- int i = 1;
- if(((Integer)otherVeryLong.digits.get(0)).intValue()==0){
- this.digits.clear();
- this.digits.add(0);
- return ;
- }
- VeryLongInt sum = new VeryLongInt("1");
- VeryLongInt mult = new VeryLongInt(this.toString());
- while(!sum.equal(otherVeryLong)){
- this.add(mult);
- sum.add(new VeryLongInt("1"));
- }
- }//任意大數與單個數字相乘
-
- public void multiply(VeryLongInt otherVeryLong){
- int length = otherVeryLong.digits.size();
- VeryLongInt multiply;
- VeryLongInt multiplycopy = new VeryLongInt(this.toString());
- this.digits.clear();
- this.digits.add(0);
- for(int i=0;i<length;i++ ){
- multiply = new VeryLongInt(multiplycopy.toString());
- multiply.mult(new VeryLongInt((otherVeryLong.digits.get(i)).toString()));
- for(int j=1;j<length-i;j++)
- multiply.digits.add(0);
- this.add(multiply);
- }
- }//大數與大數相乘
-
- public int least(int i ){
- return i>=this.digits.size()?0:((Integer)this.digits.get(this.digits.size()-i-1)).intValue();
- }//返回從低位到高位第i位數字
-
- public boolean equal(VeryLongInt v1){
- if (this.digits.size()!=v1.digits.size())
- return false;
- int length = this.digits.size();
- for(int i=length-1;i>=0;i--){
- if (((Integer)this.digits.get(i)).intValue()!=((Integer)v1.digits.get(i)).intValue())
- return false;
- }
- return true;
- }//判斷兩大數是否相等
-
- }
- public class ArrListDemo{
- public static void main(String args[]){
- VeryLongInt str1 = new VeryLongInt("11114532632462523462362547457357");
- str1.add(new VeryLongInt("0"));
- System.out.println(str1.toString());
- str1.multiply(new VeryLongInt("333333462462346234452643634247"));
- System.out.println(str1.toString());
- }
- }
output:
11114532632462523462362547457357
3704845646029468841285610955774783288521573545337081737305179
附幾點ArrayList類與數組的幾點區別:
1,當構造數組時必須指定初始容量,但是ArrayList不需要,ArrayList類提供了三種構造方法,以便於你選擇是否需要指定初始容量。
2,在數組中插入元素時,必須指定索引值,而在ArrayList類中的add()方法則自動選擇在ArrayList對象的末尾插入元素。
3,ArrayList類中的size()方法返回ArrayList對象中元素個數,而數組中的length字段則保存了數組可以插入的元素的最大值。
4,ArrayList類中的set()方法可以更改指定索引位置的元素,類似與數組中的直接賦值。
5,ArrayList類中的remove()方法可以刪除指定索引位置的元素,而且時間復雜度為O(1),而數組中實現這一功能則需要移動所刪元素的後半段空間。
6,在數組中查找是否具有某一元素需要進行顯式搜索,而在ArrayList類中只需一個indexOf()方法即可搞定。
當然,數組在一些地方依然有著ArrayList類無法替代的位置:
1,索引運算符可以用來訪問或者修改數組中的元素。
eg:a[i]=a[j+1];
2,數組可以在構造的時候進行初始化。
eg:String []a = {"a","b","c"};
3,我們可以在數組的任意索引位置存儲元素,但是對於ArrayList對象,只能在索引值為0、1、....、size()的位置存儲元素。
4,可以創建任意類型(甚至是原始類型,例如int)的數組。對於ArrayList對象,每個元素的類型必須是Object或其子類。