Sorry for my poor english as i'm not a native english speaker and writer, but i have written a code which calculates big numbers, adding subtracting and multiplying.
when multiplying, adding and subracting numbers, it works, but when i try adding 0 to 0 or subtracting 0 to 0 or multiplying 0 to 0 it does not seem to work. also for when multiplying a number with 0 or vice versa, it also does not work :(( i have no idea why can somehelp me please?
pheonixkid 0 Newbie Poster
javaAddict 900 Nearly a Senior Poster Team Colleague Featured Poster
Can you post some code? Have you tried debugging your code by adding some System.out.println messages to see what is happenig as the code runs?
pheonixkid 0 Newbie Poster
sorry i did not post the code, i tried again, but for every result that becomes 0 does not seem, to work... is there a problem with the input? under the public static void method?
import java.io.*;
public class bigInteger3 {
void caculator(byte[] N,char O,byte[] M){
switch(O){
case '-' :
negate(M);
case '+' :
plus(N,M);
break;
case '*' :
multiply(N,M);
break;
default :
System.out.println("잘못된 입력");
break;
}
}
void optim(byte[] X,byte top,int len){
if(top>0){
for(int i=0;i<len;i++){
if(X[i]<0){
X[i]+=10;
X[i+1]--;
}
if(X[i]>9){
X[i]-=10;
X[i+1]++;
}
}
}
else if(top<0){
for(int i=0;i<X.length-1;i++){
if(X[i]>0){
X[i]-=10;
X[i+1]++;
}
if(X[i]<-9){
X[i]+=10;
X[i+1]--;
}
}
}
else
optim(X,X[len-2],len-1);
}
void optim(byte[] X,int x,int y){
X[x+y+1]+=(byte)(X[x+y]/10);
X[x+y]=(byte)(X[x+y]%10);
}
void reverse(byte[] X,int len){
if(len==1)
return;
byte temp=X[0];
for(int i=0; i<len-1; i++){
X[i]=X[i+1];
}
X[len-1]=temp;
reverse(X,len-1);
}
void negate(byte[] M){
for(int i=0;i<M.length;i++)
M[i]=(byte)-M[i];
}
static String trim(byte[] B){
int c=0,index=0;
String s="";
for(int i=0;i<B.length;i++){
s=s+Byte.toString(B[i]);
}
while(s.charAt(index)=='0'){index++;c++;}
s=s.substring(c);
if(s.charAt(0)=='-'){
s=s.replaceAll("-","");
s="-"+s;
}
return s;
}
byte[] LargerOfTwo(byte[][] T){
if(T[0].length>T[1].length)
return T[0];
else return T[1];
}
int Min(int x,int y){
if(x>y) return y;
else return x;
}
int Max(int x,int y){
if(x>y) return x;
else return y;
}
/* void plus2(byte[] N,byte[] M){
int L1=N.length;
int L2=M.length;
int min=Min(L1,L2);
int max=Max(L1,L2);
int L3=max+1;
reverse(N,L1);
reverse(M,L2);
byte[][] Temp={N,M};
byte[] Tempp=LongOfTwo(Temp);
byte[] Sum=new byte[max+1];
for(int i=0;i<min;i++)
Sum[i]=(byte)(N[i]+M[i]); //아래숫자더하기
for(int i=min;i<max;i++)
Sum[i]=(byte)(Tempp[i]); //위에 숫자 더하기
optim(Sum,Sum[L3-1],L3);
reverse(Sum,L3);
System.out.println(trim(Sum));
};
*/
void plus(byte[] N,byte[] M){
int L1=N.length;
int L2=M.length;
int L3=Max(L1,L2)+1;
int L4=Min(L1,L2);
byte[] Sum=new byte[L3];
reverse(N,L1);
reverse(M,L2);
byte[][] Temp={N,M};
byte[] Tempp=LargerOfTwo(Temp);
for(int i=0;i<Tempp.length;i++)
Sum[i]=(byte)(Tempp[i]);
for(int j=0;j<L4;j++)
Sum[j]=(byte)(N[j]+M[j]);
optim(Sum,Sum[L3-1],L3);
reverse(Sum,L3);
System.out.println(trim(Sum));
/*
String s="";
for(int i=0;i<Sum.length;i++){
s=s+Byte.toString(Sum[i])+"|";
}
System.out.println(s);
*/
};
void minus(byte[] N,byte[] M){
negate(M);
plus(N,M);
}; //negation호출,plus호출};
void multiply(byte[] N,byte[] M){
int i=0,j=0;
int L1=N.length,L2=M.length,MAX=L1+L2+1;
byte[] Summation=new byte[MAX];
reverse(N,L1);
reverse(M,L2);
for(i=0;i<L2;i++){
for(j=0;j<L1;j++){
Summation[i+j]=(byte)(Summation[i+j]+M[i]*N[j]);
optim(Summation,i,j);
}
}
reverse(Summation,MAX);
System.out.println(trim(Summation));
}
byte[] calculation(String OrginInput){
String input=OrginInput.replaceAll(" ","");
int index=0,count=0,start=0,maxlen=input.length();
byte[] Number;
//System.out.println("maxlen = "+maxlen);
while(!Character.isDigit(input.charAt(index))){
//System.out.println("index = "+index);
if(input.charAt(index)=='-')count++; index++;
}
start=index;
while(index<maxlen&&Character.isDigit(input.charAt(index))){
//System.out.println("index = "+index);
index++;
}
Number=new byte[index-start];
for(int j=0;j<Number.length;j++){
Number[j]=(byte)(input.charAt(start+j)-48);
}
if(count%2==1)negate(Number);
/////여기까지 숫자
if(index<maxlen)
caculator(Number,input.charAt(index),calculation(input.substring(index+1)));
return Number;
}
public static void main(String[] args){
//숫자입력
//숫자를 자르기
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
while(true){
bigInteger3 bi= new bigInteger3();
try{
String OrginInput = br.readLine();
if (OrginInput.compareTo("quit") == 0)
{
break;
}
bi.calculation(OrginInput);
}
catch (Exception e)
{
System.out.println("입력이 잘못되었습니다. 오류 : " + e.toString());
}
}
}
}
pheonixkid 0 Newbie Poster
should i try putting in some System.out.println(""); codes in the methods to see where it is not working from?
javaAddict 900 Nearly a Senior Poster Team Colleague Featured Poster
If I am to call it, what argument should I pass?
JamesCherrill 4,733 Most Valuable Poster Team Colleague Featured Poster
should i try putting in some System.out.println(""); codes in the methods to see where it is not working from?
Yes, absolutely yes. That's always a good thing to do right from the start.
javaAddict 900 Nearly a Senior Poster Team Colleague Featured Poster
I have been looking at your code and i don't understand the byte[] calculation(String OrginInput) method. If it is used to "extract" the numbers from the input there are better ways to do it. Also why do you call the negate method inside:
if (count % 2 == 1)
negate(Number);
When you can simply call the caculator with a minus?
Also calling the calculation method again with recursion isn't very smart.
From what I understand you are trying to convert numbers into byte arrays. I tried simplifying your code. Is this example correct:
String input2 = "56";
byte[] Number2 = new byte[input2.length()];
for (int j = 0; j < Number2.length; j++) {
Number2[j] = (byte) (input2.charAt(j) - 48);
}
If so then after testing I found that there is a problem when the result is zero. Not when you are trying to add or multiply with zero.
while (s.charAt(index) == '0') {
index++;
c++;
}
At the above code if s is all zeros (s="000") then the expression at the while will always be true. The index will keep increasing and you will get an exception. When you call the charAt you always need to check the length of the String compering it with the index you use. It is like looping an array:
for (int i=0;i<arr.length;i++)
while (index<s.length() && s.charAt(index) == '0') {
index++;
c++;
}
s = s.substring(c);
if (s.length()>0 && s.charAt(0) == '-') {
s = s.replaceAll("-", "");
s = "-" + s;
}
Try calling in the main method method something like this and test it for various inputs:
BigInteger3 bi = new BigInteger3();
String input1 = "......";
// convert input1 to an array of bytes
String input2 = "......";
// convert input2 to an array of bytes
bi.caculator(Number1, '+', Number2);
bi.caculator(Number1, '-', Number2);
bi.caculator(Number1, '*', Number2);
Then try to work your way with parsing the input. Can you post an example of inputs that you would normally pass?
pheonixkid 0 Newbie Poster
Yes, your simplification code is correct.
ohhhh, so in the while loop, it will be true when s is 0 and keep looping causing the exception error?
i'll try the main method you have suggested :)
example of inputs i would try are big numbers such as 1000000000000000+1000000000000000 <- these.
but for those large numbers it works, just for when the result is 0.
i tried adding the System.out.println("worked succesfully"); at the end of all methods, but when running the code, it does not seem to be printing out that line for all methods, for example, i have 9 of those lines, but only 7 show when it seems to work(for this i'm guesssing that some of the methods are not used so not all shows), but only 2 shows for when the result is 0(for this i have tried looking back through the methods but it seems i'm not that much of a debugger person :(((((((
JamesCherrill 4,733 Most Valuable Poster Team Colleague Featured Poster
i'm not that much of a debugger person
All it needs is a little practice, so don't be worried! Instead of just printing "OK", print some of the actual data values, so you can see exactly what's happening. For example, in your trim method you could add some prints like this...
static String trim(byte[] B){
int c=0,index=0;
String s="";
for(int i=0;i<B.length;i++){
s=s+Byte.toString(B[i]);
}
System.out.println("1. s= " + s); // was s constructed properly?
while(s.charAt(index)=='0'){index++;c++;}
s=s.substring(c);
System.out.println("2. s= " + s); // now what's happened to s?
if(s.charAt(0)=='-'){
s=s.replaceAll("-","");
s="-"+s;
}
System.out.println("3. s= " + s); // and what value are we returning?
return s;
}
(Note the use of text like "2. s=" so you can see what output is which when there's a lot of printout)
ps to print an array in a readable format you can use the following example:
System.out.println("N= " + Arrays.toString(N)); // where N is an array
pheonixkid 0 Newbie Poster
thank you ~.~
Be a part of the DaniWeb community
We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.