:: 게시판
:: 이전 게시판
|
- PGR21 관련된 질문 및 건의는 [건의 게시판]을 이용바랍니다.
- (2013년 3월 이전) 오래된 질문글은 [이전 질문 게시판]에 있습니다. 통합 규정을 준수해 주십시오. (2015.12.25.)
통합규정 1.3 이용안내 인용"Pgr은 '명문화된 삭제규정'이 반드시 필요하지 않은 분을 환영합니다.법 없이도 사는 사람, 남에게 상처를 주지 않으면서 같이 이야기 나눌 수 있는 분이면 좋겠습니다."
24/07/10 00:32
C는 잘 못합니다만.... for(;;)면 무한반복이라 대신에 소인수분해가 종료되는 조건이 들어가야 될 겁니다. while (N > 1) { 로 바꾸면 어떨지요?
24/07/10 00:34
디버깅에 대해 알아보실 딱 적절한 타이밍 같아요.
21번줄에 브레이크포인트를 잡는 법을 알아보시고, 디버그 모드로 실행하는 법을 알아보시고, 한줄 한줄 실행하는 법, 함수 호출하는 줄에선 함수 내부로 디버깅을 타고 들어가는법 을 알아보셔서 내 코드가 한줄 한줄 어떻게 돌아가는지 파악하시고 나면 문제점이 보이실겁니다.
24/07/10 02:30
맨 밖의 무한 for(;;) 문은 내부 for 문의 break 로는 나갈 수 없습니다.
이 부분이 님의 코드가 67에서 멈춘 이유입니다. 그 아래 break는 else 문 안쪽으로 이동하시고요. 이것 때문에 밖의 무한 for(;;)와 연계되어 2*2*67까지는 나온 것이긴 합니다만 for문을 두 개 쓰기보다 한 개만 쓰고 종료될 시점에 break를 쓰는게 좋습니다. else 문 안쪽인 이유는 n이 i로 나누어 떨어졌을 떄 n이 i인 경우는 마지막 소수이기 때문입니다. 그리고 맨 아래 i = 2 로 하면 알고리즘 연산 상 시간 낭비 비효율적인 코드입니다. i-- 로 바꿔주셔야 합니다. 이로 인해 외부 for(;;)는 없어도 계속 연산이 가능하고요. 따라서 for 문을 아래와 같이 바꾸면 정상 작동할 것입니다. for (let i = 2; i<= n; i++) { if (n % i == 0) { if (n != i) printf("%d * ", i); else { printf("%d", i); break; } n = n/i; i--; } }
24/07/10 09:13
답변은 윗분들이 잘 해주셨고, 별개로 이런 질문은 AI가 기가막히게 답해줍니다.
질문 많이 하시는거 아니면 무료버전으로도 충분합니다. ChatGPT나 Claude.ai 써보세요 아래는 Claude 답변입니다. [네, 이 코드의 주요 문제점들을 해결하는 방법을 설명해드리겠습니다: 무한 루프 문제: soinsu 함수의 무한 루프로 인해 마지막 printf가 실행되지 않습니다. 이를 해결하기 위해 적절한 종료 조건을 추가해야 합니다. 함수 반환값 미사용: soinsu 함수가 의미 없는 0을 반환하고 있습니다. 이를 void 함수로 변경하거나, 유용한 정보를 반환하도록 수정해야 합니다. 비효율적인 알고리즘: 현재 알고리즘은 불필요한 반복을 수행합니다. 최적화가 필요합니다. 출력 형식: 마지막 인수 뒤에 불필요한 '*'가 출력되는 문제가 있습니다. 이러한 문제점들을 해결한 개선된 코드는 다음과 같습니다: (수정 코드 생략...)]
24/07/10 11:28
위 코드를 그대로 사용하고 싶으시다면
else { printf("%d", i); return 0; } 이렇게 하면 마지막 숫자를 출력한 뒤 함수에서 벗어나게 됩니다.
24/07/11 09:26
break 관련된 부분은 윗분들이 설명해주셨고
소인수분해 자체의 구조를 개선하시는 게 좋습니다 이 경우에는 for문보다 while문이 보다 유용할 수 있습니다 아래 코드는 예시입니다. int div=2 while(n>1) if(n%div==0) //출력관련구문 n =n/div; else div++;
|