coding_test/BAEKJOON

백준 2231번 C언어 풀이

CodeJin 2021. 8. 25. 20: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

https://codejin.tistory.com/10

 

백준 4673번 C언어 풀이

https://www.acmicpc.net/problem/4673 4673번: 셀프 넘버 셀프 넘버는 1949년 인도 수학자 D.R. Kaprekar가 이름 붙였다. 양의 정수 n에 대해서 d(n)을 n과 n의 각 자리수를 더하는 함수라고 정의하자. 예를 들어..

codejin.tistory.com

4673번 문제를 풀면서 이 문제를 역연산으로 접근하려고 하다가 포기했던 문제인데, 기어코 역연산으로 풀게 만들었다.

 

뭐 어쩔수 있나. 하나하나 따져야지.....

 

(알고보니 하나하나 따져야 하는 브루트 포스단계의 문제였다.)

 

분명 논리적으로 맞는거 같은데 항상 컴퓨터는 내가 원하는대로 안따라준다.

 

내가 잘못한거겠지 뭐..... 어디서 틀린건지도 사실 모르겠다.

#include <stdio.h>
#include <math.h>

int main () {
    int n, a = 10, cnt = 10; // 입력받은 셀프넘버, 생성자
    int check = 0; // 만들어진 셀프넘버, n과 같은지 체크하기 위함
    int is_true = 0; // 존재하는지 체크하기 위한 변수

    // scanf("%d", &n);
    n = 216;
    while (cnt<=n) {
        a = cnt;
        check = cnt;
        for (int i = 0; i <= floor(log10(cnt)+1); i++) {
            check += a % 10;
            a /= 10;
        }
        // printf("%d, %d\n", cnt, check);
        if(check == n) {
            is_true = 1;
            break;
            }
        cnt++;
    }
    printf("%d", is_true ? cnt : 0);
    return 0;
}

-------------------이거 올리고 난 직후-------------------

 

테스트하려고 a와 cnt의 값을 올려놨다가 안 바꿨다......

 

하....

 

#include <stdio.h>
#include <math.h>

int main () {
    int n, a = 1, cnt = 1; // 입력받은 셀프넘버, 생성자
    int check = 0; // 만들어진 셀프넘버, n과 같은지 체크하기 위함
    int is_true = 0; // 존재하는지 체크하기 위한 변수

    scanf("%d", &n);
    // n = 216;
    while (cnt<=n) {
        a = cnt;
        check = cnt;
        for (int i = 0; i <= floor(log10(cnt)+1); i++) {
            check += a % 10;
            a /= 10;
        }
        // printf("%d, %d\n", cnt, check);
        if(check == n) {
            is_true = 1;
            break;
            }
        cnt++;
    }
    printf("%d", is_true ? cnt : 0);
    return 0;
}