题目意思: 给定一个数n,然后进行操作,先求出这个数每一位的平方和,然后这个和替代n继续做这个操作,知道当前的n为1 或 n之前以经出现过 ,如果n等于则是happy number ,反之不是。
解题思路: 暴力搜素+状态判重。
对于这一题一个状态就是这个数字n,由于最大的n是10^9,那么平方和最大不超过1000,我们开一个vis[1000]数组来做为标记数组即可,当遇到n 初始值 或 vis[n] = 1则退出,初始化vis[1] = 1;
代码:
#include <algorithm>
#include <iostream>
#include <cstring>
#include <string>
#include <vector>
#include <cstdio>
#include <stack>
#include <queue>
#include <cmath>
using namespace std;
#define MAXN 10000
int vis[MAXN];
int main(){
//freopen("input.txt" , "r" , stdin);
int sum , flag , cnt;
int i , n , m;
scanf("%d%*c" , &cnt);
for(i = 1 ; i <= cnt ; i++){
scanf("%d" , &n);
memset(vis , 0 , sizeof(vis));
flag = 0 ; m = n ; vis[1] = 1;
while(1){
sum = 0;
for(int j = n ; j !=0 ; j = n){
int t = n%10;
sum += t*t;
n /= 10;
}
n = sum ;
if(vis[n] || n == m){
if(n == 1) flag = 1;
break;
}
vis[n] = 1;
}
if(flag) printf("Case #%d: %d is a Happy number.\n" , i , m);
else printf("Case #%d: %d is an Unhappy number.\n" , i , m);
}
return 0;
}