具体解法代码里都有,注意最大数为999999999,所以最大只有9*9^2=729.
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <set>
#include <vector>
#include <map>
#include <cmath>
#include <algorithm>
#include <memory.h>
#include <string>
#include <cstring>
#include <sstream>
#include <cstdlib>
#include <ctime>
#include <cassert>
using namespace std;
int hash[730];//用来标记某个数是否被访问过
int get_qsum(int x)
{
char a[10];
int sum=0;
int len=sprintf(a,"%d",x);//不知道的百度一下这个函数吧
for(int i=0;i<len;i++)
sum+=(a[i]-'0')*(a[i]-'0');
return sum;
}
bool solve(int i)
{
int newi=i;
bool flag=false;
while(newi=get_qsum(newi))
{
if(newi==1) {flag=true; break;}
else if(hash[newi] || newi==i) break;
hash[newi] = 1;
}
return flag;
}
int main()
{
int T,n,i;
scanf("%d",&T);
for(i=1;i<=T;i++)
{
scanf("%d",&n);
memset(hash,0,sizeof(hash));//每次都把数组初始化0
int newn=get_qsum(n);//把输入的数处理一次,使得newn最大为729,缩小查找范围
if(solve(newn))
printf("Case #%d: %d is a Happy number.\n",i,n);
else
printf("Case #%d: %d is an Unhappy number.\n",i,n);
}
return 0;
}