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("(완전수)");
        }

cs

이렇게 구할수 있다.


<<전체코드>> 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