So I've been working on this BigNum multiplication method (in short the method takes in a BigNum other and is supposed to return the product of two large positive integers without using the bigint class) for a while and I'm almost done however, I am still having issues appending zeroes. My helper method does not seem to be adding correctly either (as an ex. 444*4 should return as "1776" however it returns as "161616".) I need someone to debug this and help me figure out why it isn't working. Any help is appreciated.
Here's the result I get when I try doing 444*444 as an example
the expected output should be:
1776
17760
177600
197136
actual output with my code:
161616
1616160
1616160
3393936
My methods
/**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);
}
Using String to implement BIGNUM multiply is rather slow, however it works. Change your code as follows:
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);
}
Next time you should also paste your add() method. Here's my implementation of add(), if anyone's interested (pretty ugly I have to say):
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;
}
All of these methods goes into this BigNum class:
public class BigNum {
String num;
public BigNum() {
num=new String();
}
public BigNum(String s) {
this.num=s;
}
... methods here...
}
Use the following logic: 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)));
}
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.