20111210

ACM 640 Self Numbers

反過來做,找到所有的generator,
剩下的就不是generator。

用一個array做mark的動作。

/* ACM 640 Self Numbers
 * mythnc
 * 2011/12/10 20:41:52   
 * run time: 0.08
 */
#include <stdio.h>

#define MAXN  1000001
#define TRUE  1
#define FALSE 0

int sumd(int);

int mark[MAXN];

int main(void)
{
    int i, sum;

    for (i = 1; i < MAXN; i++)
        if (!mark[i]) {
            sum = sumd(i);
            while (sum < MAXN && !mark[sum]) {
                mark[sum] = TRUE;
                sum = sumd(sum);
            }
        }
    /* output */
    for (i = 1; i < MAXN; i++)
        if (!mark[i])
            printf("%d\n", i);

    return 0;
}

/* sumd: do d(n) and return the value */
int sumd(int n)
{
    int sum;

    for (sum = n; n; n /= 10)
        sum += n % 10;

    return sum;
}

沒有留言: