hdu 4235 Vampire Numbers

直接暴力,不过加了点优化:

1.如果你求出50的答案是126,那么50-126的答案都是126了;

2.求10的时候,只用循环到有答案的那个(比如是50)就行了,不用到126了。

View Code
#include <stdio.h>
#include <math.h>
#include <string.h>

int ans[1000305],ar[10],now;

int judge(int a,int b,int c)
{
    int i,num[10]={0};
    while (a)
    {
        num[a%10]++;
        a/=10;
    }
    while (b)
    {
        num[b%10]--;
        b/=10;
    }
    while (c)
    {
        num[c%10]--;
        c/=10;
    }
    for (i=0;i<10;i++)if(num[i]!=0)return 0;
    return 1;
}

int make()
{
    int i,l=sqrt(now*1.0);
    for (i=2;i<=l;i++) 
    {
        if(now%i==0&&judge(now,i,now/i))return 1;
    }
    return 0;
}

void init(int n)
{
    int i;
    now=n;
    while (1)
    {
        if(make())
        {
            for (i=n;i<=now;i++)ans[i]=now;
            return;
        };
        now++;
        if(ans[now])
        {
            for (i=n;i<=now;i++)ans[i]=ans[now];
            return;
        }
    }
}

int main()
{
    int n,i;
    while (scanf("%d",&n)&&n)
    {
        if(ans[n])printf("%d\n",ans[n]);
        else
        {
            init(n);
            printf("%d\n",ans[n]);
        }
    }
    return 0;
}
posted @ 2012-04-26 10:37  104_gogo  阅读(326)  评论(0编辑  收藏  举报