Я должен создать программу, в которой пользователь вводит два числа, которые могут быть отрицательными или положительными и могут содержать десятичные знаки или нет. Теоретически, когда вы добавляете слово «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;
}
}
Я не уверен, что вы имеете в виду, вы не можете разобрать их. Вам нужно разобрать строку так или иначе, infact в вашем текущем подходе вы уже разбираете числа. – for3st
@ for3st: не совсем верно. В конечном счете, да, при * some * point ввод строки должен быть преобразован в «число», хотя бы потому, что его нужно добавить/вычесть. Но назначение OP * ясно *, чтобы сделать это по одному персонажу за раз. Это не относится к оптовой конвертации в поплавки. Цель этого задания состоит в том, чтобы создать функциональность BigNum с нуля. – usr2564301
'(char) (sumDigit - 48) + sum.decimal;' будет работать лучше с '+': 'sumDigit + 48'. (Вы также можете сделать 'sumDigit + '0'' для ясности). Также вы можете предоставить алгоритм выражения _in english_ (а не java)? Очевидно, что что-то не так в вашей реализации вычитания. – Volune