2011-05-14 3 views
-1

정수 인수보다 큰 첫 번째 완전한 정사각형을 반환하는 함수를 작성해야합니다. 완전한 정사각형은 정수 제곱과 같은 정수입니다. 16 = 4 * 4이기 때문에 예를 들어 16은 완벽한 사각형입니다. 그러나 15 = n * n과 같은 정수 n이 없기 때문에 15는 완벽한 사각형이 아닙니다.정수 인수보다 큰 첫 번째 완전한 정사각형을 반환하십시오.

public static int NextPerfectSquare(int inputNumber) 
{ 
    if (inputNumber < 0) return 0; 
    inputNumber++; 
    var result = Math.Sqrt(inputNumber); 
    var resultnumber = (int) result; 
    if (resultnumber == result) return inputNumber; 
    resultnumber++; 
    return resultnumber * resultnumber; 

} 

이게 맞습니까?

+12

로 코드를 줄일 수있다) 그러나 물론 내 개인 환경 설정 될 수 있을까요? –

+0

"if (resultnumber == result) ..."라는 줄의 의미를 명확히 할 수 있습니까? 당신은 double과 int를 비교합니다. –

+0

그래 나는 너무 혼란 스럽다. (resultnumber == result) return inputNumber;이 줄이 필요 없다고 생각한다. inputNumber를 반환하면 완벽한 사각형이 반환됩니다. ??? –

답변

3

기본 솔루션이 좋아 보인다. 다음을 고려해보십시오.

  • 이 기능에 설명을 추가해야합니까? 아마 시험을 위해서가 아니라, 고려할만한 가치가있을 것입니다.
  • 매개 변수/로컬 변수에 대해 일관된 케이스를 사용하십시오. 그들이 더 명확하게 지명 될 수 있는지 고려하십시오.
  • 경계 조건은 어떻습니까? 당신은 negative case를 다루었지만 inputNumber가 int.MaxValue에 가까워서 다음 완벽한 square가 MaxValue가 될 수 있다면 어떨까요?
+0

그가 왜 필요합니까? (resultnumber == result) return inputNumber; ??? –

1

나에게 맞는 것 같습니다. 음수를 처리하고, 완벽하게 사각형이 아닌 임의의 값을 처리하고, 완벽한 사각형을 올바르게 처리하므로, 예를 선택합니다.

1

종류.

하지만 몇 가지 테스트를 실행하여이 문제를 아주 쉽게 확인할 수 있었기 때문에 그 일을 맡기는 것이 싫습니다.

System.Console.WriteLine("-10 => {0}", NextPerfectSquare(-10)); 
System.Console.WriteLine("0 => {0}", NextPerfectSquare(0)); 
System.Console.WriteLine("1 => {0}", NextPerfectSquare(1)); 
System.Console.WriteLine("15 => {0}", NextPerfectSquare(15)); 
System.Console.WriteLine("21 => {0}", NextPerfectSquare(21)); 
System.Console.WriteLine("24 => {0}", NextPerfectSquare(24)); 
System.Console.WriteLine("36 => {0}", NextPerfectSquare(36)); 
System.Console.WriteLine("Max => {0}", NextPerfectSquare(int.MaxValue)); 
System.Console.WriteLine("Min => {0}", NextPerfectSquare(int.MinValue)); 

-10 => 0 
0 => 1 
1 => 4 
15 => 16 
21 => 25 
24 => 25 
36 => 49 
Max => 1 
Min => 0 

그래서 보너스 포인트를 위해 약간 최적화 할 수 있습니까?

큰 숫자는 안전하게 만드십시오. 즉 long/Int64

최대 값 오버플로를 방지하십시오. (int.MaxValue를 입력 해보십시오.)

1

제대로 작동하는 것 같습니다.

나는 개인적으로 같은 갈 것이다 : 나는 논리를 보여줍니다 조금 명확하게 생각하는

public static int Next(int inputNumber) 
{ 
    if (inputNumber < 0) return 0; 

    int perfectWidth = (int)Math.Floor(Math.Sqrt(inputNumber)); 
    return (int)Math.Pow(perfectWidth + 1, 2); 
} 

.

0

당신은 당신이 지금 시험에 있습니까

public static int NextPerfectSquare(int inputNumber) 
{ 
    if (inputNumber < 0) return 0; 
    var result = Math.Sqrt(inputNumber); 
    var resultnumber = (int) result; 
    resultnumber++; 
    return resultnumber * resultnumber; 

}