2014-09-06 48 views
0

我应该创建一个程序,用户输入两个可能为负数或正数并且可能包含小数位的数字。理论上,当你添加说“256.78 + 78.6783”时,它应该像正常的加法问题一样运行并完成操作。在Java中添加和减去字符串数字

我已经想出了如何添加任何长度的数字,只有当他们是积极的,带我永远,但是当我添加负数甚至减去数字,我没有得到正确的结果。这应该与用户输入的任何一组两个数字一起工作。

这是我的代码到目前为止,有什么建议吗?
P.S.我不允许在手术前将这些数字转换为intdouble,因此解析它们是不可能的。

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

林不知道你的意思,你不能解析它们。您需要以某种方式解析字符串,事实上,您现在正在解析数字。 – for3st 2014-09-06 11:42:32

+0

@ for3st:不完全正确。最终,是的,在* some *点,字符串输入需要被转换为“数字”,如果仅仅因为它需要被加/减。但是OP的任务很明显是一次只能做一个角色。批量转换为浮动的情况并非如此。这个任务的目的似乎是从头开始设计BigNum功能。 – usr2564301 2014-09-06 11:48:52

+0

'(char)(sumDigit - 48)+ sum.decimal;''+':'sumDigit + 48'会更好。 (为了清晰起见,您也可以执行'sumDigit +'0'')。你也可以提供减法的算法_in english_(不是java)吗?在你的减法实现中显然有些问题。 – Volune 2014-09-06 11:55:06

回答

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 2014-09-08 02:35:11

+0

你能找出哪个数字更大,哪个数字更小,如果你不能告诉你逻辑,但是告诉我,首先你可以找出在这种情况下,如果你能找出更大的答案,很容易就可以告诉你答案。所以你只需要把注意力集中在符号上,如果符号不同的话就从更大的那个中减去一个较小的那个 – saching 2014-09-08 06:12:34

+0

实际上,不,我不知道该怎么做。你可以用循环做些什么吗?我真的卡住了,任何帮助将不胜感激! – Rocketsm46 2014-09-09 01:53:38