2017-11-03 18 views
-4

I n은 계승 수있는 경우 발견하기 위해 노력하고있어하지만 난 내 코드에 대한주기)에 대한 잘못된 생각에 계승 수있는 경우 :찾기 n은 자바

static boolean fatorial(int n){ 

    for (int a = 2; a < n; a = a * (a+1)){ 
     if (n/a == 1){ 
      return true; 
     } 
    } 
    return false; 
} 
+1

"계승 번호"란 무엇입니까? 피보나치? –

+0

'a '의 값은 2, 6, 42가 될 것입니다 ... 당신이 원했던 것이 확실하지 않습니다. –

+3

a = a * (a + 1)가 잘못되었습니다 – mehulmpt

답변

4

A = A *의 (a +1) 다음 = 2로부터 시작하는 다음 = 2 * 3 = 6 =이 같이 쓸 수

static boolean fatorial(int n){ 
    long res = 1; 
    int i = 2; 
    while(res < n) { 
     res = res * i++; 
    } 
    return res == n; // if res == n that means n was a factorial (res is always a factorial) 
} 
+0

'i'를 늘릴 필요가 없습니까? – Vasan

+0

@Vasan은 그것을 놓쳤습니다! – mehulmpt

+1

분수를 사용하는 것보다 이해하기 쉽고 정수 나누기가 번거롭지 않습니다. +1 –

2

6 * 7 = 42 ... : 빈 경우

for (int a = 2; n % a == 0; n /= a++) {} 
return n == 1; 

을 for loop body는 당신을 불편하게 만듭니다 :

int a = 2; 
while (n % a == 0) { 
    n /= a; 
    a++; 
} 
return n == 1; 

설명하려면, 값 2, 3, 4, 5가되는, a으로 나눌

  • 확인 n 경우 ...
  • 을하면 해당 의해 나눌 수없는 경우 n이 처음에는 계계가 아니 었습니다.
  • 나눌 수있는 경우 n을 해당 숫자로 나눕니다 (이후 체크 (*)에서 다시 계산하지 않으므로), a을 증가 시키십시오.

마지막으로 n == 1 인 경우 루프를 일찍 깨지 않았으며 처음에는 계승이었습니다. 예컨대


(*)는, 600 = 2*3*4*5*5는 계승 아니지만 때문에 2*3의 6으로 나눌 수있다. 당신이 그것을 발견 한 후에 2와 3으로 나누면 실수로 다시 계산하지 않는다는 의미로 나눌 수 있습니다.