일단 소스부터
#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라는 임시변수를 쓴거와 이유가 같아.
나머지는 다 소스 주석에 써 있으니 참고.
아하 9^2*9 이해햇어양! 고마어양