Ranking (as of 2013-12-15): 62 out of 603
Language: C++
/* UVa 944 - Happy Numbers To build using Visual Studio 2012: cl -EHsc -O2 UVa_944_Happy_Numbers.cpp */ #include <cstdio> #include <cstring> const int n_max = 99999, sum_of_squares_max = 405; enum {unknown, happy, unhappy}; struct happy_number { int happy_; // 0 for unknown, 1 for happy, 2 for unhappy int nr_iterations_; } happy_numbers[n_max + 1]; int sum_of_squares[sum_of_squares_max + 1]; // sum_of_squares[i] is the number whose sum of squares is i int calculate_sum_of_squares(int n) { int d, s = 0; do { d = n % 10; s += d * d; n /= 10; } while (n); return s; } void set_happy_numbers(int number, int nr_iterations) { do { happy_numbers[number].happy_ = happy; happy_numbers[number].nr_iterations_ = nr_iterations++; number = sum_of_squares[number]; } while (number != -1); } void set_unhappy_numbers(int number) { do { happy_numbers[number].happy_ = unhappy; number = sum_of_squares[number]; } while (number != -1); } int main() { int n; for (n = 1; n <= sum_of_squares_max; n++) { if (happy_numbers[n].happy_ == unknown) { int m = n; memset(sum_of_squares, 0, sizeof(sum_of_squares)); sum_of_squares[m] = -1; while (true) { int s = calculate_sum_of_squares(m); if (s == 1 || happy_numbers[s].happy_ == happy) { set_happy_numbers(m, happy_numbers[s].nr_iterations_ + 1); break; } else if (sum_of_squares[s] || happy_numbers[s].happy_ == unhappy) { set_unhappy_numbers(m); break; } sum_of_squares[s] = m; m = s; } } #ifdef DEBUG if (happy_numbers[n].happy_ == happy) printf("%d %d\n", n, happy_numbers[n].nr_iterations_); #endif } for ( ; n <= n_max; n++) { int s = calculate_sum_of_squares(n); if (happy_numbers[s].happy_ == happy) { happy_numbers[n].happy_ = happy; happy_numbers[n].nr_iterations_ = happy_numbers[s].nr_iterations_ + 1; #ifdef DEBUG printf("%d %d\n", n, happy_numbers[n].nr_iterations_); #endif } else happy_numbers[n].happy_ = unhappy; } bool printed = false; int l, h; while (scanf("%d %d", &l, &h) != EOF) { if (printed) putchar('\n'); else printed = true; for (n = l; n <= h; n++) if (happy_numbers[n].happy_ == happy) printf("%d %d\n", n, happy_numbers[n].nr_iterations_); } return 0; }
No comments:
Post a Comment