int main() { int i, v, prev_v, c = 0; for (i = 1; i < SIZE; i++) { v = sum_square_digits(i); while (v != 89 && v != 1) { prev_v = v; v = sum_square_digits(v); } if (v == 89) { c++; } } printf("%d\n", c); return 0; }
int main(void) { unsigned int i=0,result=0, count=0; for (i=1; i<=100000000; i++) { // if not 1 or 89, start the iteration if ((i != 1) || (i != 89)) { result = sum_square_digits(i); } // otherwise we're done already else { result = i; } // while we haven't reached 1 or 89, keep iterating while ((result != 1) && (result != 89)) { result = sum_square_digits(result); } if (result == 89) { count++; } } std::cout << count << std::endl; return 0; }
// builds all combinations digits 0-9 of length len // for each of these it will perform iterated digit squaring // and for those which result in 89 add to a counter which is // passed by pointer. long choose_sum_and_count_89(int * got, int n_chosen, int len, int at, int max_types, int *count89) { int i; long count = 0; int digitcounts[10]; for (i=0; i < 10; i++) { digitcounts[i]=0; } if (n_chosen == len) { if (!got) return 1; int sum=0; for (i = 0; i < len; i++) { int digit=digits[got[i]]; digitcounts[digit]++; sum=sum + digit * digit; } if (sum == 0) { return 1; } if ((sum != 1) && (sum != 89)) { while ((sum != 1) && (sum != 89)) { sum=sum_square_digits(sum); } } if (sum == 89) { int count_this_comb=factorial(len); for (i=0; i<10; i++) { count_this_comb/=factorial(digitcounts[i]); } (*count89)+=count_this_comb; } return 1; } for (i = at; i < max_types; i++) { if (got) got[n_chosen] = i; count += choose_sum_and_count_89(got, n_chosen + 1, len, i, max_types, count89); } return count; }
uint64_t convergent(uint64_t start) { while(start != 1 && start != 89) start = sum_square_digits(start); return start; }