2015-02-24 63 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... 
} 
相关问题