4673: 셀프 넘버

2022. 1. 16. 19:58문제연습/알고리즘

반응형

 

 

문제 해결 과정)

복잡하게 생각할 필요가 없으며, 문제에서 제시한 Self Number의 충족 조건을 정확히 알고 있으면 풀 수 있는 문제입니다.

예를 들어 156이라는 수가 있다고 하고 이 수를 생성자로 가지는 수가 있는지 확인하는 방법은 아래와 같습니다.

 

156 + 1 + 5 + 6 = 168, 따라서 168은 156을 생성자로 가지므로 self number가 아닙니다.

 

생성자가 있는지 없는지 확인하는 함수를 check_selfNum(int *p)로 정의하고, 계산 과정에서 자릿수를 분리하여 합하는 함수를 digit_sum(int number);으로 정의하였습니다.

 

#include <stdio.h>

int num[10001];

void check_selfNum(int *p);
int digit_sum(int number);

int main(){
    check_selfNum(num);
    for(int i=0;i<10000;i++){
        if(num[i]==0)
            printf("%d\n", i+1);
    }
}



void check_selfNum(int *p){ //셀프넘버인지 아닌지 구별하는 함수
    int sum = 0;
    int index = 0;
    
    for(int i=1; i<10001; i++){
        sum = (i-1) + digit_sum((i-1)); // 각 자리수의 합과 자기자신 수를 합함.
        if(sum >10000)
            continue;
        index = sum -1;
        num[index]=1; //만약 생성자가 존재할 경우 해당 인덱스의 배열값을 1로 초기화함.
    }
}


int digit_sum(int number){ //입력받은 수의 자리값을 분리하여 각각의 합을 리턴함.
    int sum = 0;
    int remain = 0;
    
    sum += number%10;
    remain = number/10;
    while(1){
        if(remain == 0)
            break;
            
        sum +=remain%10;
        remain = remain/10;
    }
    return sum;
}
 

 

 

반응형

'문제연습 > 알고리즘' 카테고리의 다른 글

24416 : 알고리즘 수업 - 피보나치 수 1  (0) 2022.10.27
1065: 한수  (0) 2022.01.30
11047: 동전 0(백준)  (0) 2022.01.07
2164: 카드 2(백준)  (0) 2021.09.29
10733: 제로(백준)  (0) 2021.09.19