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; }