2014-09-06 4 views
0

Я должен создать программу, в которой пользователь вводит два числа, которые могут быть отрицательными или положительными и могут содержать десятичные знаки или нет. Теоретически, когда вы добавляете слово «256.78 + 78.6783», предполагается перенести его как обычную проблему с добавлением и завершить операцию.Добавление и вычитание строковых чисел в Java

Я понял, как добавить числа любой длины только тогда, когда они положительные, что взяло меня FOREVER, но когда я добавляю отрицательные числа или даже вычитаю число, я не получаю правильный результат. Это должно работать с любым набором из двух чисел, которые вводит пользователь.

Вот мой код до сих пор, любые предложения?
P.S. Я НЕ ДОЛЖЕН преобразовать эти цифры в int или double до операции, поэтому для их анализа не может быть и речи.

public class Number { 
    static Scanner kbd = new Scanner (System.in); 
    private String sign; 
    private String whole; 
    private String decimal; 
    private String fraction; 
    private static double firstNumber; 
    private static double secondNumber; 

    public static void main(String[] args) { 

     System.out.println("Please enter the first number: "); 
     firstNumber = kbd.nextDouble(); 
     System.out.println("Next, enter the second number: "); 
     secondNumber = kbd.nextDouble(); 

     Number x = new Number (firstNumber); 
     Number y = new Number (secondNumber); 
     Number sum = x.add(y); 
     System.out.println("x = " + x); 
     System.out.println("y = " + y); 
     System.out.println("x + y = " + sum); 
     Number subtract = x.subtract(y); 
     System.out.println("x - y = " + subtract); 
    } 
    public Number() 
    { 
     whole = "0"; 
     decimal = "0"; 
     sign = "+"; 
    } 
    public String toString() 
    { 
     return sign + whole + "." + decimal; 
    } 
    public Number (double n) 
    { 
     whole = "0"; 
     decimal = "0"; 
     sign = "+"; 

     String numString = new Double(n).toString(); 
     if (numString.charAt(0) == '-') { 
      sign ="-"; 
      numString = numString.substring(1); 
     } 
     int position = numString.indexOf("."); 
     if (position == -1) 
      whole = numString; 
     else 
     { 
      whole = numString.substring(0,position); 
      decimal = numString.substring(position+1); 
      fraction = ""; 
     } 
    } 

    public Number add (Number RHS) { 
     this.fixWhole (RHS); 
     this.fixDecimal(RHS); 
     return this.addNum (RHS); 
    } 
    public Number subtract (Number RHS) { 
     this.fixWhole(RHS); 
     this.fixDecimal(RHS); 
     return this.subtractNum (RHS); 
    } 
    private void fixWhole (Number RHS) { 
     int firstWholeNum = this.whole.length(); 
     int secondWholeNum = RHS.whole.length(); 
     int difference = firstWholeNum - secondWholeNum; 
     if (difference > 0) { 
      for (int i = 1; i <= difference; i++) 
       RHS.whole = "0" + RHS.whole; 
     } 
     else if (difference < 0) { 
      difference = Math.abs(difference); 
      for (int i = 1; i <= difference; i++) 
       this.whole = "0" + this.whole; 
     } 
    } 

    private void fixDecimal (Number RHS) { 
     int firstDecimalNum = this.decimal.length(); 
     int secondDecimalNum = RHS.decimal.length(); 
     int difference = firstDecimalNum - secondDecimalNum; 

     if (difference > 0) { 
      for (int i = 1; i <= difference; i++) 
       RHS.decimal = RHS.decimal + "0"; 
     } 
     else if (difference < 0) 
     { 
      difference = Math.abs(difference); 
      for (int i = 1; i <= difference; i ++) 
       this.decimal = this.decimal + "0"; 
     } 
    } 

    private Number addNum (Number RHS) { 
     Number sum = new Number(); 
     sum.decimal = ""; 
     int carry = 0; 
     int decimalNum = this.decimal.length(); 
     for (int i = decimalNum - 1; i >= 0; i --) { 
      char c1 = this.decimal.charAt(i); 
      char c2 = RHS.decimal.charAt(i); 
      int tempSum= (c1 - 48) + (c2 - 48) + carry; 
      carry = tempSum/ 10; 
      int sumDigit = tempSum % 10; 
      sum.decimal = (char) (sumDigit + 48) + sum.decimal; 
     } 
     sum.whole = ""; 
     int wholeNum = this.whole.length(); 
     for (int i = wholeNum - 1; i >= 0; i --) { 
      char c1 = this.whole.charAt(i); 
      char c2 = RHS.whole.charAt(i); 
      int tempSum = (c1 - 48) + (c2 - 48) + carry; 
      carry = tempSum/10; 
      int sumDigit = tempSum % 10; 
      sum.whole = (char) (sumDigit + 48) + sum.whole; 
     } 
     if (carry != 0) 
      sum.whole = "1" + sum.whole; 
     return sum; 
    } 

    private Number subtractNum (Number RHS) { 
     Number sum = new Number(); 
     sum.decimal = ""; 
     int carry = 0; 
     int decimalNum = this.decimal.length(); 
     for (int i = decimalNum - 1; i >= 0; i --) { 
      char c1 = this.decimal.charAt(i); 
      char c2 = RHS.decimal.charAt(i); 
      int tempSum= (c1 - 48) - (c2 - 48) - carry; 
      carry = tempSum/ 10; 
      int sumDigit = tempSum % 10; 
      sum.decimal = (char) (sumDigit - 48) + sum.decimal; 
     } 
     sum.whole = ""; 
     int wholeNum = this.whole.length(); 
     for (int i = wholeNum - 1; i >= 0; i --) { 
      char c1 = this.whole.charAt(i); 
      char c2 = RHS.whole.charAt(i); 
      int tempSum = (c1 - 48) - (c2 - 48) + carry; 
      carry = tempSum/10; 
      int sumDigit = tempSum % 10; 
      sum.whole = (char) (sumDigit + 48) + sum.whole; 
     } 
     if (carry != 0) 
      sum.whole = "1" + sum.whole; 
     return sum; 
    } 
} 
+0

Я не уверен, что вы имеете в виду, вы не можете разобрать их. Вам нужно разобрать строку так или иначе, infact в вашем текущем подходе вы уже разбираете числа. – for3st

+0

@ for3st: не совсем верно. В конечном счете, да, при * some * point ввод строки должен быть преобразован в «число», хотя бы потому, что его нужно добавить/вычесть. Но назначение OP * ясно *, чтобы сделать это по одному персонажу за раз. Это не относится к оптовой конвертации в поплавки. Цель этого задания состоит в том, чтобы создать функциональность BigNum с нуля. – usr2564301

+0

'(char) (sumDigit - 48) + sum.decimal;' будет работать лучше с '+': 'sumDigit + 48'. (Вы также можете сделать 'sumDigit + '0'' для ясности). Также вы можете предоставить алгоритм выражения _in english_ (а не java)? Очевидно, что что-то не так в вашей реализации вычитания. – Volune

ответ

2

принимать как числа как строки и сохранить знаки в строку знака в соответствующие числа объектов и вызове метода как

System.out.println("Please enter the first number: "); 
     firstNumber = kbd.nextString(); 
     System.out.println("Next, enter the second number: "); 
     secondNumber = kbd.nextString(); 

     Number x = new Number (firstNumber.substring(1),firstNumber.charAt(0)); 
     Number y = new Number (secondNumber.substring(1),secondNumber.charAt(0)); 

/*convert the firstNumber.substring(1) and secondNumber.substring(1) to doubles using Double.parseDouble()*/ 

public String doTheOperation(Number other){ 
if(this.sign.equals(otherNumber.sign)){ 
    /*simply the double values and put the sign*/ in front of it and return it 
} 

else{ 
    do the simple double subtraction and by looking at your code i believe you can find out the bigger double among them 
} 
} 
+0

Привет, я не должен использовать синтаксический анализ для выполнения операций, мое назначение - сделать арифметический символ по характеру. также, вы имеете в виду проверку ввода, где, если пользователь вводит отрицательное число, я вызываю метод, который выполняет операцию для отрицательных чисел? – Rocketsm46

+0

вы можете узнать, какое число больше и которое меньше, если вы не можете сказать вам логику, но сначала скажите мне, можете ли вы узнать, в этом случае вам будет легко рассказать вам ответ, если вы сможете узнать больше поэтому вам нужно всего лишь сосредоточиться на знаке, если знаки разные, вычесть меньший из более крупного – saching

+0

на самом деле, нет, я не знаю, как это сделать. вы можете что-то делать с петлями? я действительно застрял, любая помощь будет принята с благодарностью! – Rocketsm46