C언어 약수, 소수, 제곱수, 완전수 구하기
2018. 9. 22. 00:00ㆍ개발노트
우선 소수와 제곱수 그리고 완전수가 무엇인지 알아보자
약수는 어떤 수를 나누어 떨어지게 하는 수이다.
식으로 나타내면 n%i = 0
코드로는
1 2 3 4 5 6 | if ((n%i) == 0) { printf("%d ", i); count++; per += i; } | cs |
i가 계속 늘어나며 n을 나누고 0으로 나누어 떨어지면 출력시킨다.
변수 count가 나온 이유는 소수 때문이다.
변수 per가 나온 이유는 완전수 때문이다.
소수는 1과 자기 자신만으로 나누어 떨어지는 1보다 큰 양의 정수이다.
즉 소수는 2개의 수만 존재한다.
따라서 코드는 다음과 같이 나타낸다.
1 2 3 4 | if (count == 2) { printf("(소수)"); } | cs |
제곱수는 어떤 수의 제곱이 되는 수이다.
1, 4, 9,16 .....
약수를 구할때 1과 자기자신을 항상 포함시키드록 했으므로
제곱수는 count % 2 == 1 이 되는 공통점을 가진다.
1 2 3 4 | if (count % 2 == 1) { printf("(제곱수)"); } | cs |
마지막으로 완전수는
예를들어 6라는 숫자가 있으면 자신을 제외한 약수들의 합이 자기 자신과 같은 수를 말한다.
6을 예로 들면 1, 2, 3, 6 이 약수인데 여기서 6을 뺀 1 + 2+ 3 = 6 이므로 완전수가 맞다.
위에서 per이라는 변수를 썼는데 per에는 1부터 자기자신까지 약수 모두를 더한다.
6이라면 1 + 2+ 3+ 6 = 12 가 된다.
28도 완전수인데 1 + 2 + 4 + 7 + 14 + 28 = 56이 되므로 자기자신 * 2의 값과 같다는 공통점이 있다.
따라서 완전수는
1 2 3 4 | if (per == n*2) { printf("(완전수)"); } |
이렇게 구할수 있다.
<<전체코드>> 1부터 50까지의 약수를 구하고 소수, 제곱수, 완전수를 구하는 코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | #include <stdio.h> int main(void) { int i; int n = 0; int count = 0; int per; while (n<50) { n++; count = 0; per = 0; printf("%d 의 약수 ", n); for (i = 1; i <= n; i++) { if ((n%i) == 0) { printf("%d ", i); count++; per += i; } } if (count == 2) { printf("(소수)"); } if (count % 2 == 1) { printf("(제곱수)"); } if (per == n*2) { printf("(완전수)"); } printf("\n"); } } | cs |