[16일차](홍정모의따배c)소수판단예제
*본 강의수기는 교수님의 모든 ppt나 코드 화면을 붙인게 아닙니다. 따로 출처 표시나 과제표시
안한 모든 코드와 사진자료의 출처는 본 강의의 교수님 입니다.
정리는 다시한번 제가 보기위함과 어떤강의인지 알려드리는 것이고
제가 적은건 이해를 돕기 위한 부연설명과 제가 이해한 몇개의 중심적인 내용이 다소
생략이 되었습니다. 이 수기를 통해 공부하려 하지말고 흥미로운 내용이라면
'인프런- 홍정모의 따라하며 배우는c' 과정을 수강하시길 바랍니다.
- 문제
입력한 수가 소수인지 판단하는 프로그램을 만들어라.
여기서 소수란 1과 자기자신외에는 나눌 수 없는 수를 말한다.
- 힌트1
위 예시에 코드를 추가해서 만들자.
어케하노..
- 내코드
#include <stdio.h>
#include <stdbool.h>
int main()
{
unsigned num, i;
bool isPrime = 0;
scanf("%u", &num);
for(i = 1;isPrime == 0; ++i)
{
if(num % i == 0)
isPrime = 0;
}
if (isPrime)
printf("%u is a prime number", num);
else
printf("%u is not a prime number", num);
return 0;
}
이렇게 했는데 오류뜬다
왜!!!!!
왜 오류가 뜨는지 모르겠다.. 내코드가 틀린건 아닌데 왜 틀렸는지 궁금하다
우선 교수님 코드와 비교해서 다른점은
- 교수님 코드
#include <stdio.h>
#include <stdbool.h>
int main()
{
unsigned num, div;
bool isPrime;
scanf("%u", &num);
isPrime = true;
for(div = 2;div < num; ++div)
{
if(num % div == 0)
{
isPrime = false;
}
}
if (isPrime)
printf("%u is a prime number", num);
else
printf("%u is not a prime number", num);
return 0;
}
차이점은
-선언의차이 i와 div의차이
-나누는 변수의 초기값을 2로 설정한것
-isPrime의 초기값을 true로 설정하고 나는 위에서 0으로 설정한것
-for문의 가운데값을 isPrime == 0으로 설정한것
두번째와 세번째 그리고 네번째 일것이다 .
현재 정상적으로 교수님 코드로 컴파일하면
컴파일된다.
나누는 변수의 초기값을 1로 변경하면?
생각해보니 1로 설정한것부터 내가 바보였다.
다시 2로바꾸고
isPrime의 초기값을 위에서 0으로 설정하면?
당연히 뭘하든 not a prime이 나온다
초기값을 true로 설정해야
소수가 아닐때 false로 바꾸고
소수일때 true를 그대로 유지하기 때문이다.
저런 오류가뜬것은 아마 초기값을 0으로 설정한 isPrime이 0이되는동안 반복되는 문이니 당연히
정상 연산처리가 되지 않았을것.
생각을 똑바로 깊게 해보자.
for문의 반복횟수를 줄여보자
- 교수님코드
#include <stdio.h>
#include <stdbool.h>
int main()
{
unsigned num, div;
bool isPrime = 0;
scanf("%u", &num);
for(div = 2; (div*div) <= num; ++div)
//제곱한게 num이하인경우만 작동을하면 되는것이다.
{
if(num % div == 0)
{
isPrime = false;
if (num == div * div)
//만약 div의 제곱으로 나눠졌다면
printf("%u is divisible by %u\n", num, div);
else
//else문에는 제곱한수로 나눠진수는 출력안됨
printf("%u is divisible by %u and %u.\n", num, div, num / div);
}
}
if (isPrime)
printf("%u is a prime number", num);
else
printf("%u is not a prime number", num);
return 0;
}
약간의 수학적 접근이 필요하다.