看了不下8遍题目,终于看懂了,这一堆的of把人都搞昏了。注意digit与integer的区别,这里的digit指的是整数的每一位数。若在构成循环之前,有一个Si(i>=1)的值为1,则这个数是快乐的。
7->49->97( 97=4*4+9*9)->130 (1*1+3*3+0)->10->1
4 -> 16 -> 37 -> 58 -> 89 -> 145 -> 42 -> 20 -> 4中没有1,所以4是不快乐的。
思路:Hash存储每一个数,题目最大为10^9,就是8个9,8个9的下一个数为648( 81*8)。所以就是第一个数比较大,后面的数都很小了。存储了以后每求一个S就检查是否重复即可。S=1就快乐,S重复就不快乐。
#include<stdio.h>
#include<string.h>
#define MAX 100003
int origin;
int All[MAX],head[MAX],next[MAX];
int hash(int n)
{
return All[n]%MAX;
}
int isExist(int n)
{
int h,u;
h=hash(n);
u=head[h];
if(All[u]==All[n])return 1;
while(u)
{
if(All[u]==All[n])return 1;
}
next[n]=head[h];
head[h]=n;
return 0;
}
int isHappy()
{
int i,j,rear,tmp;
char num[100];
rear=1;
All[rear]=origin;
while(!isExist(rear))
{
tmp=0;
sprintf(num,"%d",All[rear]);
for(i=0;i<strlen(num);i++)
{
tmp+=(num[i]-'0')*(num[i]-'0');
}
if(tmp==1)return 1;
All[++rear]=tmp;
}
return 0;
}
int main()
{
int T,flag,test=0;
scanf("%d",&T);
while(T--)
{
flag=0;
memset(head,0,sizeof(head));
scanf("%d",&origin);
flag=isHappy();
if(flag)printf("Case #%d: %d is a Happy number.\n",++test,origin);
else printf("Case #%d: %d is an Unhappy number.\n",++test,origin);
}
return 0;
}