== 문제 설명 ==
양의 정수 S0 의 각 아라비아 숫자들의 제곱의 합으로 양의 정수 S1을 만든다고 하자. 동일한 방법이라면, S1으로 S2를 만들 수 있고, … 계속 만들 수 있다. 만약 어떤 i(i ≥ 1)에 대해서 Si = 1이라면, 최초의 S0를 Happy Number라고 부른다. Happy Number가 아닌 수를 Unhappy Number라고 부른다.
예를 들어, 7에서 시작하게 되면 다음과 같은 일련의 순서를 가지게 되며
7, 49(=7^2), 97(=4^2+9^2), 130(=9^2+7^2), 10(=1^2+3^2), 1(=1^2),
따라서 7은 즐거운 수이다.
그리고 4는
4, 16(4^2), 37(1^2+6^2), 58(3^2+7^2), 89(5^2+8^2), 145(8^2+9^2), 42(1^2+4^2+5^2), 20(4^2+2^2), 4(2^2)
의 순서로 반복되므로 Unhappy Number이다.
== 입력 ==
첫 라인은 인풋 케이스의 수 n이 주어지며 이후 n라인의 케이스가 주어진다.
각 테스트 케이스는 한 개의 양의 정수 N으로 구성되며 N은 10^9 보다 작다.
== 출력 ==
출력은 주어진 수 N이 Happy Number인지 Unhappy Number인지 여부에 따라 다음과 같이 출력한다.
N이 Happy Number라면 “Case #p: N is a Happy number.”
N이 Unhappy Number라면 “Case #p: N is an Unhappy number.”
p는 1부터 시작하는 케이스의 번호이며 각각의 케이스는 한 줄에 결과를 표시한다.
라는 문제를 풀어봤는데
#include<stdio.h>
#include<Windows.h>
int main(){
int jungsu[9],dlqfur,temp[150],i,j,k=8,w=0,result=0;//dlqfur=입력받은수 result=결과값 저장할 변수 i,j,k,w=for문 돌릴 변수 temp[150]=지금까지의 수랑 비교할 변수 jungsu[9]=입력받은 수를 저장할 변수
scanf_s("%d",&dlqfur);
temp[w]=dlqfur;
while(dlqfur>1){
for(i=0;i<9;i++){
jungsu[i]=temp[w];
for(j=0;j<k;j++){//자릿수 구하기
jungsu[i]=jungsu[i]/10;
}
for(;jungsu[i]>10;){//계산
jungsu[i]-=10;
}
if(jungsu[i]<10){
result+=jungsu[i]*jungsu[i];
}
k--;
}
k=8;
w++;
temp[w]=result;
for(i=0;i<w;i++){
if(temp[i]==1){
printf("입력한 %d는 happy number 입니다 \n 한번 더 누르시면 프로그램을 종료합니다\n",dlqfur);
system("pause");
return 0;
}
else if(temp[i]==result){
printf("입력한 %d는 unhappy number 입니다 \n 한번 더 누르시면 프로그램을 종료합니다\n",dlqfur);
system("pause");
return 0;
}
}
result=0;
if(w>150){
w=0;
}
}
}
이런데 뭐 이상한 부분이나 멍청이처럼 해놓은곳 있어요?
for(j=~~ 부분 안에 그냥 자릿수 확인이 안되고 j = 8이 되어버리잖아
그리고 굳이 왜 i를 9까지 돌려
입력된 수를 계속 자릿수의 제곱합 계산하면 많아봐야 (9^2)*9 = 729일거 아냐
그럼 check 배열를 만들어서 0~729까지의 정수가 계산결과로 나온 적이 있는지 체크해야지
그 이유는 위 예제에 나온 4에서도 나와있으니까..
그리고 result는 한번 계산할때마다 0으로 초기화 해줘야지
result는 아래쪽에 초기화 햇는데ㅠㅠ
for(j~부분은 제 실력이 미숙해서 자릿수 계산까지는 못햇어양.. 미안해양..
#include <stdio.h>#include <stdlib.h>int main(){ int num, tmp, check[729] = {0}, result; scanf("%d", #); if(num == 1) { printf("입력한 %d는 happy number 입니다 \\n 한번 더 누르시면 프로그램을 종료합니다\\n",num); [...]; return 0; } check[num] = 1; tmp = num; while(1) { result = 0;
check배열은 무슨 소리하시는지 잘 이해가 안되양..
for(int i = 0; i < 9 && tmp > 0; ++i, tmp /= 10) result += (tmp); if(result == 1 || check[result]) break; check[result] = 1; tmp = result; } if(result == 1) printf("입력한 %d는 happy number 입니다 \\n 한번 더 누르시면 프로그램을 종료합니다\\n",num); else printf("입력한 %d는 unhappy number 입니다 \\n 한번 더 누르시면 프로그램을 종료합니다\\n",num); [...]; return 0;}
위에 4가 나온 예제를 봐.
4가 입력되면 4가 나온적이 있다고 체크를 하는 거지
4를 계산하면 16
16 체크하고
계속 계산하면 37, 58, 89, 145, 42, 20은 체크가 안되어 있는 상태에서 체크가 될거고
20 계산하면 4인데 4는 이미 체크되어있는 상태니까
순환이 발생해서 절대로 1이 될 수 없잖아
소스 잘 보이게 글 새로 써줄까?
넹 그러시믄 ㄱㅅㄱㅅ