일단 소스부터

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int num, tmp, check[729+1] = {0}, result;

    scanf("%d", &num);

    if(num == 1)// 입력된 수가 1일때
    {
        printf("입력한 %d는 happy number 입니다 \\n 한번 더 누르시면 프로그램을 종료합니다\\n",num);
        system("pause");
        return 0;
    }

    check[num] = 1;
    tmp = num;

    while(1)
    {
        result = 0;
        for(int i = 0; i < 9 && tmp > 0; ++i, tmp /= 10) result += ((tmp % 10) * (tmp % 10));//tmp /= 10 하면 맨 뒤의 한 자리가 사라지고, tmp % 10은 맨 뒷자리 수
        if(result == 1 || check[result]) break;// 계산 결과가 1이거나 순환이 발생한 경우

        check[result] = 1;
        tmp = result;
    }

    if(result == 1)
        printf("입력한 %d는 happy number 입니다 \\n 한번 더 누르시면 프로그램을 종료합니다\\n",num);
    else
        printf("입력한 %d는 unhappy number 입니다 \\n 한번 더 누르시면 프로그램을 종료합니다\\n",num);

    system("pause");
    return 0;
}


일단 왜 check배열의 크기가 730인가 인데,

입력으로 들어오는 수를 num이라고 하면 num의 모든 자리가 9로 이루어질때 계산값이 최대이므로

그 때 나오는 값은 (9^2)*9=729. 0까지 체크해야 되니까 730.


저 안에 for 문의 경우에는 어차피 i는 루프 안에서만 쓰니까 그냥 안에서 선언한거.

그리고 ,(콤마) 연산자를 배웠으면 써먹어야지. 유용하니까 알아둬라.


굳이 tmp 쓴 이유는 니가 jungsu라는 임시변수를 쓴거와 이유가 같아.


나머지는 다 소스 주석에 써 있으니 참고.