코딩/백준 문제 (브론즈)

[백준/2231/C언어] 분해합 _ 풀이

룻밤 2023. 9. 3. 12:53

https://www.acmicpc.net/problem/2231

 

2231번: 분해합

어떤 자연수 N이 있을 때, 그 자연수 N의 분해합은 N과 N을 이루는 각 자리수의 합을 의미한다. 어떤 자연수 M의 분해합이 N인 경우, M을 N의 생성자라 한다. 예를 들어, 245의 분해합은 256(=245+2+4+5)이

www.acmicpc.net


풀이

#include <stdio.h>
int reverse(int n) {;
	int i = 1;		// i = i~n-1까지 가능
	while (i <= n) {	
		int sum = 0;	//초기화
		int c = i;		// i의 각 자릿수
		while (c > 1) {		// c가 1 초과일때 반복
			sum += c % 10;	// c%10 = 각자리수
			c = c / 10;		
		}
		sum += c;		// c가 1일때 sum에 더함
		sum += i;		// 분해합 공식
		// sum값이 n과 같을때가 가장 작은 생성자
		if (sum == n) return i;	
		// i과 n과 같다면(생성자 없음) 0출력
		else if (i == n) return 0;
		i++;
	}
}
int main() {
	int n;
	scanf("%d", &n);
	printf("%d\n", reverse(n));

	return 0;
}

분해합을 입력 받았을때 생성자를 구할수 있는 공식은 없다.

그렇지만 분해합 n보다 생성자는 무조건 작기 때문에

1~n-1까지 생성자라 가정하고 분해합 공식을 구현해 처음 n과 같은 생성자를 출력하면 된다.