先前的思路是观察1-10的数,可以用纯暴力从2,6,10一直循环到1000000从而找出自身数,但是会超时。于是我就想,从一个数算出下一个数,如132->138,通过138->150这样由一个数得到另一个数。这样类似于筛选法,而且只要循环一边就可以得到答案了。

CODE:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_ 1000001
using namespace std;

const int SIZE = 1000001;
int vis[SIZE] = {0};


void init(int n)
{
    int ans = n;
    while(n)
    {
        int c = n%10;
        n /= 10;
        ans += c;
    }
    vis[ans] = 1;
}

int main()
{
    int i;
    for(i = 1 ; i <= MAX_; i++)
    {
        if(!vis[i])
        {
            printf("%d\n", i);
        }
        init(i);    
    }
    return 0;

} 

posted on 2012-07-17 21:26  有间博客  阅读(150)  评论(0编辑  收藏  举报