2015-02-24 18 views
0

所以我一直在研究這個BigNum乘法方法(簡言之,方法需要一個BigNum其他方法,並且應該返回兩個大正整數的乘積而不使用bigint類)一段時間,而且我幾乎完成了然而,我仍然有問題附加零。我的幫助器方法似乎也沒有正確添加(例如,444 * 4應該返回爲「1776」,但它返回爲「161616」)。我需要有人來調試這個,並幫助我找出爲什麼它不是加工。任何幫助表示讚賞。有些人可以幫我弄清楚爲什麼我的零不會追加?

這裏的結果,當我嘗試做444 * 444爲例

預期的輸出應該是我得到:

1776 
17760 
177600 
197136 

實際輸出與我的代碼:

161616 
1616160 
1616160 
3393936 

我方法

/**Multiplies two <tt>BigNum<tt> values together and returns a new 
    *<tt>BigNum<tt> object with the resulting value. 
    * 
    *@param other object 
    *@returns a new BigNum with resulting value 
    */ 
public BigNum mult(BigNum other) { 
    BigNum tmp = new BigNum(); 
    BigNum acc = new BigNum(); 
    String s=""; 
    int count=0; 
    for(int i= 0; i < other.num.length() ; i++) { //each digit x of other 
    tmp = this.mult(Character.getNumericValue(other.num.charAt(i))); 
    if(i > 0) { 
     for(int j=0; j < i; j++) { 
      s = tmp.num + "0"; 
     } 
    }else { 
    s = tmp.num; 
    } 
    tmp=new BigNum(s); 
    count++; 
    acc = acc.add(tmp); 
} 
return acc; 
} 

/**Helper method that adds the other value a set of number of times, 0-9 
    * 
    *@param and int n and other object 
    *@returns resulting value 
    */ 
public BigNum mult(int n) { 
    String result; 
    int carry; 
    if(n==0){ 
     result="0"; 
    } 
    else{ 
     carry =0; 
     result = ""; 
    } 
    for(int i=this.num.length()-1; i >=0; i--){ 
     int temp = n * Character.getNumericValue(this.num.charAt(i)) 
     result=(temp%10) + result; 
     carry = temp/10; 
     if(carry > 0){ 
      result = carry + result; 
     } 
    } 
    return new BigNum(result); 
} 

回答

-1

使用以下邏輯:5 * 2 = 5 + 5 + 5 + 5 + 5

public class BigNum { 

    int value; 

    public BigNum(int value) { 
     this.value = value; 
    } 

    public BigNum mult(BigNum other) { 
     int result = 0; 
     for (int i = 0; i < value; i++) { 
      result += other.getValue(); 
     }; 
     return new BigNum(result); 
    } 

    public int getValue() { 
     return value; 
    } 

    @Override 
    public String toString() { 
     return "BigNum [value=" + value + "]"; 
    } 

    public static void main(String[] args) { 
     System.out.println(new BigNum(444).mult(new BigNum(444))); 
    } 

} 
+0

此代碼適用於更小的數字,但不適合較大的人(如果我做了類似1234567 * 9876543的事情就會中斷) – user4147933 2015-02-24 04:52:20

+0

是的,我現在意識到這是因爲有人否定了答案。好的,您可以重寫將值保存在int []中,例如:444應該作爲新的int [] {4,4,4}存儲。那麼你的代碼會更清晰,更易於理解 – 2015-02-24 04:55:47

1

使用字符串來執行乘法是BIGNUM相當緩慢,但它的工作原理。如下 更改代碼:

public BigNum mult(BigNum other) { 
    BigNum tmp = new BigNum(); 
    BigNum acc = new BigNum(); 
    String s=""; 
    int count=0; 
    for(int i= 0; i < other.num.length() ; i++) { //each digit x of other 
    tmp = this.mult(Character.getNumericValue(other.num.charAt(i))); 
    if(i > 0) { 
     s = tmp.num; 
     for(int j=i; j > 0 ; j--) { 
      s = s + "0"; 
     } 
    }else { 
    s = tmp.num; 
    } 
    tmp=new BigNum(s); 
    count++; 
    acc = acc.add(tmp); 
} 
return acc; 
} 

public BigNum mult(int n) { 
    String result; 
    int carry; 
    if(n==0){ 
     result="0"; 
    } 
    else{ 
     carry =0; 
     result = ""; 
    } 
    for(int i=this.num.length()-1; i >=0; i--){ 
     int temp = n * Character.getNumericValue(this.num.charAt(i)); 
     // add carry first 
     carry = temp/10; 
     if(carry > 0){ 
      int lastnum=(result.length()==0)?0: 
       Character.getNumericValue(result.charAt(result.length()-1)); 

      lastnum=lastnum+carry; 
      result = (result.length()==0)?"":result.substring(0, result.length()-1); // remove the last num 
      result = result + lastnum; 
     } 
     result= result + (temp%10); 
    } 
    return new BigNum(result); 
} 

下一次,你也應該貼上你的add()方法。下面是我實現的add(),如果任何人的興趣(很醜陋,我不得不說):

private BigNum add(BigNum other) { 
    StringBuilder sb = new StringBuilder(); 
    int sum, carry=0; 
    String large, small; 
    if(this.num.length()>=other.num.length()) { 
     large=this.num; small=other.num; 
    } else { 
     large=other.num; small = this.num; 
    } 
    int len = Math.min(this.num.length(), other.num.length()); 
    for(int i=len-1; i>=0; i--) { 
     sum = Character.getNumericValue(large.charAt(large.length()-len+i)) + 
       Character.getNumericValue(small.charAt(i)) + 
       carry; 
     carry=(sum>=10)?1:0; 
     sb.insert(0, String.valueOf(sum).charAt((sum>=10)?1:0)); 
    } 
    if(large.length()==small.length()) { 
     if(carry==1) sb.insert(0, 1); 
    } else { 
     sum = Character.getNumericValue(large.charAt(large.length()-(len+1)))+carry; 
     sb.insert(0, String.valueOf(sum).charAt(0)); 
    } 
    for(int i=large.length()-(len+2); i>=0; i--) { 
     sb.insert(0, large.charAt(i)); 
    } 
    num = sb.toString(); 
    return this; 
} 

這些方法的所有進入這個BIGNUM類:

public class BigNum { 
String num; 

public BigNum() { 
    num=new String(); 
} 

public BigNum(String s) { 
    this.num=s; 
} 

... methods here... 
} 
相關問題