fldj2855   4년 전

암만 머리를 싸매도 런타임에러를 탈출하지 못하네요..

문제점을 찾아주시면 감사하겠습니다 ㅠㅠ

/*

해결했습니다..

상상도 못한 곳에서 런타임에러가 떴네요 앞으로 주의하겠습니다ㅠ

제가 eratos의 함수를 int eratos() 로 구현 했습니다만,, return을 해주지 않아 발생한 듯 합니다.

int를 void로 고치니 잘 작동하네요..

평소 이런 부분은 별 생각안하고 코딩했는데.. 혼자 깨닫고 갑니다

*/

먼저 에라토스테네스의 체로 E배열에 소수 여부를 정해 놓습니다 ( 0 --> 소수 )

그 다음 i = 2부터 n까지 check()함수를 가게 되는데

check(int n)함수는 대략 다음처럼 작동하게 했습니다.

1. n == 1이거나 S[n] = 'O'일 경우 2를 리턴하게 했습니다. ( 'O'는 상근수라는 의미이고 2는 상근수일 때 리턴값 입니다)

2. 만약 S[n] == '#"이라면 상근수가 아니라는 의미이므로 1을 리턴하게 했습니다.

3. 위 둘중에 아무것도 아니라면 일단 S[n]에 '#'을 넣습니다 ( 만약 나중에 '#'을 밟게 되면 상근수가 아니게 되므로??)

4. check(rint(n))를 호출합니다 rint(n) 함수는 n의 각 자릿수의 제곱 합을 리턴해줍니다

5. flag가 check(rint(n))의 반환값(1, 2) 중 하나를 받게되는데 

2일 경우에는 상근수라는 의미로 판단하여 경로를 타고오면서 넣어둔 '#'을 전부 'O'로 바꿉니다

1일 경우에는 상근수가 아니므로 사전에 넣어둔 '#'을 바꾸지 않고 바로 1을 리턴합니다

이런식으로 n까지 상근수 여부를 구해놓고 E[i] == 0 && S[i] == 'O'를 만족시키는 수를 출력하게끔 헀는데

런타임 원인을 잘 모르겠습니다.. ㅠㅠ

그냥 각 소수마다 브루트포싱을 해서 풀어도 괜찮지 않을까 생각중인데.. 이 코드에 미련이 남아서 질문을 올립니더...

/* 추가 */

새로 check()함수를 만들어서 그것도 제출해봤으나 런타임이네요,,,

2번째 코드는 아래에 새로 추가했습니다

이번에는 직접 부르트포싱해서 알아내는 방식으로 해봤는데도 런타임이 뜨네요.. ㅠㅠㅠ

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