大意略。。
思路:照着模拟,然后用STL容器判断是否出现过即可。
#include <iostream> #include <cstdlib> #include <cstdio> #include <cstring> #include <string> #include <set> using namespace std; typedef long long LL; set<int> vis; int n; void init() { vis.clear(); } LL cal(int n) { LL s = 0; while(n) { int b = n % 10; s += LL(b*b); n /= 10; } return s; } void solve() { init(); scanf("%d", &n); LL st = (int)n; for(;;) { if(vis.find(st) != vis.end() && st == 1) { printf("%d is a Happy number.\n", n); break;} else if(vis.find(st) != vis.end() && st != 1) { printf("%d is an Unhappy number.\n", n); break; } vis.insert(st); st = cal(st); } } int main() { int T, times = 0; scanf("%d", &T); while(T--) { printf("Case #%d: ", ++times); solve(); } return 0; }