2015년 8월 17일 월요일

find primes

https://codefights.com/challenge/ZbGabd7jjYHRqePHy

std::vectorint > rPrimeNumbers(int aint b) {
  for(int i; i=a<=b; i==a++?r.push_back(i),0:0)
    for(; ++i<a&&a%i; );
  return r;
}

정말 타고 나긴 타고 나나 보다.
약간 보기 좋게 바꾸면,

std::vector<int> PrimeNumbers(int a, int b) {
  for(int i; i=a<=b;)
    {
      for(; ++i<a&&a%i; )
{
          //skip non-prime numbers                                                                                                              
}
      if(i==a++) {
r.push_back(i);
      }
    }
  return r;

}

선언은 내 gcc로는 에러나는데 codefight에서는 되는것 같다. 여튼간에,
받은 변수(a)를 잘 이용해서 새로운 변수를 선언하지 않는 것이나,  전위, 후위 연산자를 적절하게 이용하는 것, for문을 잘 이용하는 것등은 익숙한데,  i==a++?r.push_back(i),0:0 이거 하나 더 배웠다. expression을 만들기 위해 0을 넣다니.

i는 종료조건에 다다르기 전까지 무조건 1에서부터 시작하고(그렇지 않다면 0으로 for가 종료된다) for문 처음에 ++i가 있어서 1을 제외하는 문제는 자연스럽게 해결된다. (1은 소수가 아니니까 제외해야 한다). 목표점(a)에 다다를때까지 어떤 숫자로도 나눠지지 않으면 소수이고, 마지막에 a++때문에 b에 도달할때까지 차례로 모든 수를 검사하게 된다.






댓글 없음:

댓글 쓰기