题目意思: 给定一个数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; }