https://www.acmicpc.net/problem/2231
분배합...생성자...
익숙한 단어가 아니라 자꾸 반대로 생각하게 되느라 이해를 좀 하느라 시간이 걸렸습니다..ㅎㅎㅋㅋㅋ
숫자 N이 주어졌을 때, M은 N = M + M의 각자리수 이를 성립해야합니다.
ex. N : 216 M: 198 => 198 + 1 + 9 + 8 = 216
N의 범위가 1 ≤ N ≤ 1,000,000이므로 각자리수를 자동으로 판단하여 분배합을 구하는 식이 필요하고!. -> 필요한 식 1
그 이후 가장 작은 분배합을 구하는 식이 필요합니다. -> 식 2
1) 분배합
while(num != 0){
int a = num%10;
sum += a;
num/= 10;
}
sum += input;
sum은 해당 input에 대해 분배합을 저장하는 변수입니다.
2) 가장 작은 분배합
if(sum == n) {
if(answer > input){
answer = input;
}
}
분해합이 초기 주어진 N과 비교하여 같고, 이전의 구한 수보다 작을 경우 답을 바꿉니다.
#include <iostream>
using namespace std;
int n;
int sum = 0;
int answer;
void find(int input){
sum = 0;
int num = input;
while(num != 0){
int a = num%10;
sum += a;
num/= 10;
}
sum += input;
if(sum == n) {
if(answer > input){
answer = input;
}
}
}
int main(){
scanf("%d", &n);
answer = n;
for(int i = 1; i < n ; i++){
find(n-i);
}
if(answer == n) answer = 0;
cout << answer;
return 0;
}