/* Good But Not Perfect */ void factor(int n, int a[], int *num) /* returns the factors of a number */ { int i; for (i = 2; i < n; i++) if (n % i == 0) { a[0] = i; factor(n/i, a+1, num); *num = *num + 1; return; } /* n is prime */ a[0] = n; *num = 1; } int sum_digits(int n) /* sums the digits of a number */ { int sum = 0; while (n > 0) { sum += n % 10; n /= 10; } return sum; } int good(int n) /* returns 1 iff n is a good number */ { int num; /* number of factors of n */ int array[1000]; /* holds factors of n */ int i; int sum_fact; /* sum of digits of prime factors of n */ factor(n, array, &num); sum_fact = 0; for (i = 0; i < num; i++) sum_fact += sum_digits(array[i]); return sum_fact == sum_digits(n); } void main(void) { int n; do { scanf("%d", &n); if (n == 0) break; if (good(n)) printf("%d is a good number\n", n); else printf("%d is not a good number\n", n); } while (1); }