Reputation: 5681
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
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
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