读书人

[模拟+击表]hdoj 4235:Vampire Numbe

发布时间: 2012-09-08 10:48:07 作者: rapoo

[模拟+打表]hdoj 4235:Vampire Numbers

大致题意:
? ? 如果一个数字n能分解为两个数字的乘积,且这两个数字的各位数字的个数之和与n的各位数字的个数相同,则称n为Vampire Numbers。现在输入一个数,求大于等于这个数的最小的Vampire Numbers。

?

大致思路:
? ? 比赛时乍看上去一点思路都没有,后来想了想,写个程序,把所有的Vampire Numbers打了出来,然后水过去了

打表程序(不是ac代码!):

#include<iostream>#include<cstring>#include<cmath>#include<cstdio>using namespace std;int vis[20];int num[20];bool isval(){    for(int i=0;i<10;i++){        if(vis[i]!=num[i]){            return 0;        }    }    return 1;}bool getnum(long long n){    long long a=n;    long long b,c;    memset(vis,0,sizeof(vis));    while(a){        vis[a%10]++;        a/=10;    }    for(long long i=2;i<sqrt(n);i++){        if(n%i==0){            memset(num,0,sizeof(num));            b=i,c=n/i;            while(b){                num[b%10]++;                b/=10;            }            while(c){                num[c%10]++;                c/=10;            }//            if(i==6){//                for(i=0;i<10;i++){//                    cout<<num[i]<<" ";//                }cout<<endl;//            }            if(isval()){                return 1;            }        }    }    return 0;}int main(){    long long i,j,n,k=0;    freopen("gift.out","w",stdout);//    cout<<getnum(126)<<endl;    for(i=11;i<=1000000;i++){//        printf("%d\n",i);        if(getnum(i)){            printf(",%d",i);            k++;        }    }cout<<"\nfuck"<<k<<endl;    return 0;}

?

具体ac的代码就不贴了,就是把上面代码输出的结果复制粘贴一下。

读书人网 >编程

热点推荐