c언어 입문 3일차, 좌절..으아아악

4

이 문제를 풀어보려고 했습니다.
일단 3일차인 제가 아는 지식은 “함수 호출”, “반복문”, "조건문"이게 전부에요.

그래도 문제를 읽어보니, 조금 복잡하더라도 반복문과 조건문을 잘 사용한다면 해낼 수 있을 것 같았습니다…ㅠㅠㅠ

1
2

제가 생각한 로직은 그냥 반복문 굴려서 수를 평가하자…는겁니다.
[A=B+B의 모든 자리수 합]을 만족하는 수 B가 없다면 A는 셀프 넘버니까, 만족하는 B가 나올때까지 반복문으로 반목하고, 만약 그런 B가 있다면 출력하지 않고, 그런 B가 없다면 출력하도록 해봤습니다…

예를들어 숫자 20이 셀프넘버인지 알고싶다면, 0~19까지의 수중 자신+자신의 자리수 총 합이 20인 수가 나올때까지 반복문으로 확인하는식이에욤…

근데 으…
오류는 안뜨는뎅 컴파일러가 멈춰버립니다…
아ㅏㅏㅏ…

독학은 너무 어려워…

4 Likes

3일차라고 하셨는데, (개인적인 생각이지만) 진도가 너무 빠른 것 같습니다. 다른 언어를 알고 계신다면 상관없겠지만, 더 쉬운 연습문제 등으로 기초를 다지시는 것이 좋을 것 같습니다.

어차피 모든 문제는 forif로 풀 수 있으니, 너무 조급하게 풀지 마시고 별찍기 등을 좀 더 풀어 보시는게 어떨까요?

혹시 저 같은 초심자가 풀 만한 연습문제들 모아놓은 사이트 없을까요ㅠ,

코딩도장도 괜찮고, 백준에도 십 수개의 별찍기가 있는 걸로 압니다.

짜면 늘어요…ㅠㅠ

그리고 이 문제는 check[]를 0으로 초기화한 후 1부터 10000의 i에 대해 check[ d(i) ] = 1을 수행하고, 1부터 10000의 i에 대해 check[ i ] == 0을 만족하는 i를 출력하는 방식으로 풀어야 합니다. 1부터 10000의 i에 대해 각각 셀프 넘버임을 보이는 것은 비효율적이기 때문입니다.

3일차에 이런 문제를 푼다구요? 천재심? ㄷㄷ 홧팅입니다

2 Likes

괜히 어려운거 건드렸다가 성공도 못하고 피똥싸고 다시 기초문제로 돌아갔습니다…;
역시 3일차에겐 3일차 수준에 맞는 문제를 푸는게 제일 맞는 것 같아요… 대체 몇 시간을 매달린건지 원…

1 Like
#include <cstdio>

constexpr int N = 10000;

template< int tp >
struct nya {};

template< int tp >
int hap(nya< tp >)
{
      return tp % 10 + hap(nya< tp / 10 >{});
}

template<>
inline int hap(nya< 0 >)
{
      return 0;
}

template< int tp >
int d(nya< tp >)
{
      return tp + hap(nya< tp >{});
}

template< int ta, int tb >
bool is_self(nya< ta >, nya< tb >)
{
      return(ta != d(nya< tb >{})) && is_self(nya< ta >{}, nya< tb - 1 >{});
}

template< int ta >
bool is_self(nya< ta >, nya< 1 >)
{
      return ta != d(nya< 1 >{});
}

template< int tp >
void pro(nya< tp >)
{
      if(is_self(nya< tp >{}, nya< tp >{}))
      {
            printf("%d\n", tp);
      }

      pro(nya< tp + 1 >{});
}

template<>
inline void pro(nya< N >)
{
      if(is_self(nya< N >{}, nya< N >{}))
      {
            printf("%d ", N);
      }
}

int main()
{
      pro(nya< 1 >{});

      return 0;
}

나중에 풀어도 늦지 않은 문제입니다.

같이 화이팅 합시다 ㅠㅠㅠ