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 |