又来一道题目。。。还是很水的题目,但是我还是MLE了一次。WA了两次。
主要是做题的经验太少太少了。开始的时候开的是一个10^8的数组来存储结果。果断MLE了。但是后来突然想到如果一个数不能整除sqrt(n)前面的素数那么它肯定是一个素数啊。想到之后,又回想起貌似在哪里看到过这个结论。哎,经验问题,想到现在做得最多的还是DP的题一共做了10道,我能不水么。
于是后来开了一个10^4的数组。其实对于a[]数组也只用开10000就好,经验问题,但是在循环的时候m还是应该等于10000.两次WA是怎么回事呢,在我弄10000以前的数据的时候没有只是看它能否被prime数组中的数整除。当输入1的时候果断悲剧。。
上代码:
#include<stdio.h>
#include<string.h>
int n,a[10000];
int prime[10000];
int c=0;
void f(void){
int m=100;
int i,j;
memset(a,0,sizeof(a));
for(i=2;i<=10000;i++){
if(!a[i]){
prime[c++]=i;
if(c==1)
for(j=i*i;j<=10000;j+=i)a[j]=1;
}
}
}
main(){
int m,sum,k,tot,i,p,flag;
f();
prime[0]=2;
while(scanf("%d",&n)!=-1 && n!=0){
while(++n){
flag=0;tot=0;sum=-1;
for(i=0;i<=c-1;i++){
if(n%prime[i]==0 && n!=prime[i])
flag=1;
}
if(flag==1){
m=n;sum=0;
while(m){
sum+=m%10;
m=m/10;
}
k=0;m=n;
while(k<c){
if(m%prime[k]==0){
m=m/prime[k];
p=prime[k];
while(p){
tot+=p%10;
p=p/10;
}
}
else
k++;
}
if(m>=2){
while(m){
tot+=m%10;
m=m/10;
}
}
if(tot==sum){
printf("%d\n",n);
break;
}
}
}
}
}