plaidshirt
plaidshirt

Reputation: 5681

Integer square digit by digit

There should be a program, which square every digit of an integer and after that concatenate these temporary numbers into a new integer. I have written a code, which do the trick regarding to my test cases, but an automated tester gives errors for some random generated input numbers.

public class SquareDigit {
  public int squareDigits(int n) {
    int tmp = 0;
    String returnvalue="";

    while(n > 0) {
        tmp = n % 10;
        tmp = tmp * tmp;
        returnvalue = returnvalue + Integer.toString(tmp);
        n /= 10;
    }       
    int result=Integer.parseInt(returnvalue);

    return result;
  }
}

Upvotes: 0

Views: 2460

Answers (2)

binoternary
binoternary

Reputation: 1915

Use

returnvalue = Integer.toString(tmp) + returnvalue;

instead of

returnvalue = returnvalue + Integer.toString(tmp);

You iterate the digits from back to front so e.g for input 123 the intermediate results should be

  • "9"
  • "49"
  • "149"

but in your code it's

  • "9"
  • "94"
  • "941"

Upvotes: 1

Davide Lorenzo MARINO
Davide Lorenzo MARINO

Reputation: 26926

Use BigInteger. A BigInteger is a class that hold integer with arbitrary precision:

Immutable arbitrary-precision integers.

Your code become wrong when squaring a number you go over the maximum available range of type int. A long can solve the problem if you test on a range that is under the long range. A BigInteger work for any integer number.


Code should be something similar to that:

public  BigInteger squareDigits(int n) {
    BigInteger tmp = null;
    String returnvalue = "";

    while (n > 0) {
        tmp = BigInteger.valueOf(n % 10);
        tmp = tmp.pow(2);
        returnvalue = returnvalue + String.valueOf(tmp);
        n /= 10;
    }       

    return new BigInteger(returnvalue);
  }


  ...

  System.out.println(squareDigits(123456789));  // Print 816449362516941

Upvotes: 2

Related Questions