Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package theaddingcalculator;
- import java.util.ArrayList;
- import java.util.Arrays;
- import java.util.List;
- import java.util.Scanner;
- public class Addingcalculator {
- final List<Character> operationSign = Arrays.asList('+', '-', '/', '*', '^');
- private int number1;
- private int number2;
- private char operation;
- Addingcalculator(int number1, char operation, int number2) {
- this.number1 = number1;
- this.number2 = number2;
- this.operation = operation;
- }
- Addingcalculator() {
- Scanner scan = new Scanner(System.in);
- System.out.println("Write operation: ");
- String separatedInput = addingCalculatorInputFormat(scan.nextLine());
- this.number1 = Integer.valueOf(separatedInput.substring(0, separatedInput.indexOf(' ')));
- this.operation = separatedInput.charAt(separatedInput.indexOf(' ') + 1);
- this.number2 = Integer.valueOf(separatedInput.substring(separatedInput.lastIndexOf(' ') + 1));
- }
- private String addingCalculatorInputFormat(String scanLine) {
- String separatedLine = "";
- boolean sign = false;
- separatedLine += scanLine.charAt(0);
- for (int i = 1; i < scanLine.length(); i++) {
- if (!sign && operationSign.contains(scanLine.charAt(i))) {
- separatedLine += " " + scanLine.charAt(i) + " ";
- sign = true;
- } else if (!sign && scanLine.charAt(i) != ' ') {
- separatedLine += scanLine.charAt(i);
- } else if (sign && scanLine.charAt(i) != ' ') {
- separatedLine += scanLine.charAt(i);
- }
- }
- return separatedLine;
- }
- // private int Math.negateExact(int number) {
- // int Math.negateExactNumber = Integer.MIN_VALUE;
- // while (number + Math.negateExactNumber != 0) {
- // Math.negateExactNumber++;
- // }
- // return Math.negateExactNumber;
- // }
- private int adding(int number1, int number2) {
- return number1 + number2;
- }
- private int subtraction(int number1, int number2) {
- return number1 + Math.negateExact(number2);
- }
- private int multiply(int number1, int number2) {
- int result = 0;
- int signNumber1 = 0;
- int signNumber2 = 0;
- if (number2 < 0) {
- signNumber2 = Math.negateExact(number2);
- } else {
- signNumber2 = number2;
- }
- if (number1 < 0) {
- signNumber1 = Math.negateExact(number1);
- } else {
- signNumber1 = number1;
- }
- for (int i = 0; i < signNumber2; i++) {
- result += signNumber1;
- }
- if (isMultiplyPositive(number1, number2))
- return result;
- else
- return Math.negateExact(result);
- }
- private boolean isMultiplyPositive(int number1, int number2) {
- return ((number1 > 0 && number2 > 0) || (number1 < 0 && number2 < 0));
- }
- private boolean isDividePreCalulateInteger(int number1, int number2) {
- if ((number1 > 0 && number1 < number2) || (number1 < 0 && Math.negateExact(number1) < number2)) {
- System.out.println("Non-integral answer");
- return false;
- } else if (number1 == 0 && number2 == 0) {
- System.out.println("Not-defined");
- return false;
- } else if (number2 == 0) {
- System.out.println("Divide by 0 error!");
- return false;
- } else {
- if ((number1 > 0 && isDivideInteger(number1, number2) == number1)
- || (number1 < 0 && isDivideInteger(number1, number2) == Math.negateExact(number1)))
- return true;
- else
- System.out.println("Non-integral answer");
- return false;
- }
- }
- private int isDivideInteger(int number1, int number2) {
- return divideHidden(number1, number2, true);
- }
- private int divideAnswer(int number1, int number2) {
- return divideHidden(number1, number2, false);
- }
- private int divideHidden(int number1, int number2, boolean whichInt) {
- int isInteger = 0;
- int answer = 0;
- int signNumber1 = 0;
- int signNumber2 = 0;
- if (number2 < 0) {
- signNumber2 = Math.negateExact(number2);
- } else {
- signNumber2 = number2;
- }
- if (number1 < 0) {
- signNumber1 = Math.negateExact(number1);
- } else {
- signNumber1 = number1;
- }
- while (isInteger < signNumber1) {
- isInteger += signNumber2;
- answer++;
- }
- if (!isMultiplyPositive(number1, number2))
- answer = Math.negateExact(answer);
- if (whichInt) {
- return isInteger;
- }
- return answer;
- }
- private boolean isExponentInteger(int number1, int number2) {
- if (number2 < 0) {
- System.out.println("Non-integral answer");
- return false;
- }
- return true;
- }
- private int exponentation(int number1, int number2) {
- int result;
- int signNumber1 = 0;
- if (number2 == 0) {
- result = 1;
- } else {
- if (number1 < 0) {
- signNumber1 = Math.negateExact(number1);
- } else {
- signNumber1 = number1;
- }
- result = signNumber1;
- int multiplier = 0;
- for (int i = 1; i < number2; i++) {
- for (int j = 0; j < signNumber1; j++) {
- multiplier += result;
- }
- result = multiplier;
- multiplier = 0;
- }
- }
- if (isExponentEven(number1, number2) || number1 > 0)
- return result;
- else
- return Math.negateExact(result);
- }
- public boolean isExponentEven(int number1, int number2) {
- int helper = 0;
- for (int i = 0; i <= number2; i += 2)
- helper = number2 + Math.negateExact(i);
- return helper == 0;
- }
- public void calculation(int number1, char operation, int number2) {
- int result = 0;
- boolean error = false;
- switch (operation) {
- case '+':
- result = adding(number1, number2);
- break;
- case '-':
- result = subtraction(number1, number2);
- break;
- case '*':
- result = multiply(number1, number2);
- break;
- case '/':
- if (isDividePreCalulateInteger(number1, number2))
- result = divideAnswer(number1, number2);
- else
- error = true;
- break;
- case '^':
- if (isExponentInteger(number1, number2))
- result = exponentation(number1, number2);
- else
- error = true;
- break;
- default:
- System.out.println("Sign of operation is not recognized");
- break;
- }
- if (!error)
- System.out.println(number1 + " " + operation + " " + number2 + " = " + result);
- }
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- Addingcalculator calc = new Addingcalculator();
- calc.calculation(calc.number1, calc.operation, calc.number2);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement