[C] 백준 2231 분해합

z00m__in·2021년 4월 3일
0

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

문제

어떤 자연수 N이 있을 때, 그 자연수 N의 분해합은 N과 N을 이루는 각 자리수의 합을 의미한다. 어떤 자연수 M의 분해합이 N인 경우, M을 N의 생성자라 한다. 예를 들어, 245의 분해합은 256(=245+2+4+5)이 된다. 따라서 245는 256의 생성자가 된다. 물론, 어떤 자연수의 경우에는 생성자가 없을 수도 있다. 반대로, 생성자가 여러 개인 자연수도 있을 수 있다.

자연수 N이 주어졌을 때, N의 가장 작은 생성자를 구해내는 프로그램을 작성하시오.

제출 46690 정답 비율 48%





코드

#include <stdio.h>
void print(int arr[]) {
	int M = 0;
	for (int j = 0; j < 6; j++) {
		M += arr[j] * 10 ^ j;
	}
	printf("%d", M);
}

void main() {
	int N = 0;
	scanf("%d", &N);

	int i=0, j = 0, sum= 0;
	int arr[6] = { 0 };

	while (1) {
		for (arr[i] = 9; arr[i] >= 0; arr[i] --) {
			i = 0;
			sum = N;
			sum -= (10 ^ (i)+1) * arr[i];
			i ++;
			if (sum <= 0)
				break;

			for (arr[i] = 9; arr[i] >= 0; arr[i] --) {
				sum -= (10 ^ (i)+1) * arr[i];
				i++;
				if (sum <= 0)
					break;

				for (arr[i] = 9; arr[i] >= 0; arr[i] --) {
					sum -= (10 ^ (i)+1) * arr[i];
					i++;
					if (sum <= 0)
						break;

					for (arr[i] = 9; arr[i] >= 0; arr[i] --) {
						sum -= (10 ^ (i)+1) * arr[i];
						i++;
						if (sum <= 0)
							break;

						for (arr[i] = 9; arr[i] >= 0; arr[i] --) {
							sum -= (10 ^ (i)+1) * arr[i];
							i++;
							if (sum <= 0)
								break;

							for (arr[i] = 9; arr[i] >= 0; arr[i] --) {
								sum -= (10 ^ (i)+1) * arr[i];
								i++;
								if (sum <= 0)
									break;
							}
						}

					}

				}

			}

		}
	}

	if (sum == 0)
		print(arr);
	else
		printf("0");

  }

음... 될리가 없지... 당연함...

profile
우당탕탕 기록지

0개의 댓글