2016-07-07 112 views
0

应该有一个程序,它将一个整数的每个数字平方,然后将这些临时数字连接成一个新的整数。 我已经写了一段代码,它可以处理我的测试用例,但是一个自动化测试人员给出了一些随机生成的输入数字的错误。整数正方形数字

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; 
    } 
} 
+4

问题可能是由于整数精度,使用长或BigInteger的 – Sanjeev

+0

@Sanjeev猜it's而由于Integeroverflow。 – SomeJavaGuy

回答

1

使用

returnvalue = Integer.toString(tmp) + returnvalue;

,而不是

returnvalue = returnvalue + Integer.toString(tmp);

您从后到前如此例如用于输入123重复数字的中间结果应该是

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

,但在你的代码是

  • "9"
  • "94"
  • "941"
+0

这真的很有趣,因为它使用了预定义的测试值。谢谢! – plaidshirt

2

使用BigInteger。 一个BigInteger是持有任意精度整数a类:

Immutable arbitrary-precision integers.

您的代码平方一些你去int类型的最大可用范围时变成错误的。如果您测试范围在long范围以内,则可以使用long来解决问题。 A BigInteger适用于任何整数。


代码应该是类似的东西:

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 
+0

错误:无法找到符号BigInteger tmp = 0; – plaidshirt

+0

您需要导入java.math.BigInteger; –

+0

我已经导入它,但它是一个测试环境,所以这可能导致导入问题。 – plaidshirt