ACM UVA-10591

快樂數

#define happy 1
#define unhappy 2
int main(int argc, char const* argv[])
{
    //1000000000
    //999999999
    //81*9 = 729
    int n[730] = {0}  ;
    n[1] = happy;
    for(int i = 2;i<= 729;i++){ 
        if(n[i]){
            continue;
        }
        set<int> tmp;
        tmp.insert(i);
        int sum = 0;
        int g = i;
        bool b = false;
        do {
            sum = 0;
            while(g){
                int r = g%10;
                sum = sum+r*r;
                g =g/10;
            }
            g = sum;
            if(!tmp.count(sum)){
                tmp.insert(sum);
                b = false;
            }else{
                b = true;
                break;
            }

        } while (sum != 1  && !b);
        if(sum == 1){
            for(set<int>::iterator it = tmp.begin();it != tmp.end();it++){
                n[*it] = happy;
            }
        }else{
            for(set<int>::iterator it = tmp.begin();it != tmp.end();it++){
                n[*it] = unhappy;
            }
        }
    }
    int pp;
    while(scanf("%d",&pp) != EOF){
        for(int i = 1;i<=pp;i++){
            int uu;
            scanf("%d",&uu);
            int tmp = uu;
            int sum = 0;
            while(uu){
                int r = uu%10;
                sum += r*r;
                uu /= 10;
            }
            if(n[sum] == happy){
                printf("Case #%d: %d is a Happy number.\n",i,tmp);
            }else{
                printf("Case #%d: %d is an Unhappy number.\n",i,tmp);
            }
        }
    }

    return 0;
}