sonejw0106   1년 전

질문 글 확인하며 반례들 대부분 테스트 해보았습니다.

글 올린 후에도 계속 테스트 해볼 예정입니다.

문제 예시는 전부 정상적으로 출력하였습니다.

시간제한, 컴파일 에러 등 오류가 아니라 실패로 뜹니다.

알고리즘 순서는 간략하게 하면 다음과 같습니다.

1. M, N 입력 받은 후 N+1 크기의 정수 배열 numbers 생성(0~N 까지 집어넣기 위해)

2. numbers[]를 -2로 전부 채움, -2 값은 아직 값이 변경되지 않았음을 알려주는 지표

    -> 에라토스테네스의 체 방식과 유사하게 구현했습니다.  

3. 2 부터 N 까지 numbers[]를 돌며 (인덱스로 변수 num 사용)

     3-1. numbers[num]값이 -2 인 경우, num으로 덮어 씌워준다. 처음 보는 값이므로 소수라고 판단

     3-2. 해당 num에 대해 num * 2부터 num 에 무언가를 곱한 값이 N 이하일 때까지 numbers[]를 돌며 배수들을 -1로 덮어 씌워준다.

4. M부터 N까지 numbers[]를 순환하면서 값이 0보다 큰(-2, -1 배제)경우에 대해

     4-1. sum(앞서 선언한 총 합을 나타내는 변수, 초기값 0) 이 0인경우(초깃값)의 numbers[]값을 최솟값이라 판단

     4-2. 그 외에는 sum에 더해줌

5. sum 이 0인 경우 -1 출력, 그 외 합과 최솟값을 차례대로 출력

알고리즘 오류인지, 입력 오류인지 잘 모르겠습니다.

도움 주시면 감사하겠습니다.

pill27211   1년 전

31행에서 sum이 선언만 되었을 뿐 초기화가 진행 되지 않았는데 34, 42행에서 sum을 대상으로 비교 연산을 진행 하고 있습니다.

int sum = 0, smallest = 0;과 같이 바꿔 주시면 될 것 같네요.

sonejw0106   1년 전

정확하게 꿰뚫어보셨네요...

C++ 문법에 익숙하지 않아서 한 꺼번에 선언한 줄 알았나 봅니다.

답변 감사합니다! 속이 후련하네요

댓글을 작성하려면 로그인해야 합니다.