zoj 1133 - Smith Numbers

/*
WA了两次
原因是没看清题
题目明确说明
"Wilansky decided later that a (simple and unsophisticated)
 prime number is not worth being a Smith number "
所以遇到它本身就是素数的情况要跳过
如果你输入4930000它输出的是4930001的话就说明你没有注意到这方面
正确答案是4930137
总体来讲,一道题要想做好一定要有几位清晰的思路,要考虑各种因素
计算机指令在哪个时候应该从哪过都要有一清二楚
如果你写的程序连自己都不知道他该怎么执行那么这道题几乎没有可能AC
还有
本来判断素数想到了打表 
由于数据太大所以想到了打一部分
然后小于某个数的查表
大于某个数的再判断 
本来想到会超时
结果一提交上去竟然过了
嘿嘿嘿。。。 
*/
#define LOCAL
#include<iostream>
#include<cmath>
using namespace std;
int prime(int n)
{
         int i,t=sqrt(n)+1;
         if(n==2)   return 1;    //素数的判断函数竟然写错了,导致跳不出去 
         for(i=2;i<=t;i++)
         {
                if(n%i==0)
                       return 0;                 
         }
         return 1;
}
int find(int n)
{
          int t,k,sum1,sum2,i;
          while(1)
          {
                 n++;
                 if(prime(n))   continue;   //遇到素数跳过 
                 sum1=sum2=0;
                 t=k=n;
                 while(k){sum1+=k%10;k/=10;}
                 while(!prime(t))
                 {
                     i=2;
                     while(!prime(i)||t%i!=0)
                              i++;
                     t=t/i;
                     while(i) 
                    {sum2+=i%10;i=i/10;}
                 }
                 while(t){sum2+=t%10;t/=10;}
                 if(sum1==sum2) return n;
          }
}
int main()
{
#ifdef LOCAL
       freopen("input.txt","r",stdin);
       freopen("output.txt","w",stdout);
#endif
    int n;
    while(cin>>n&&n)
           cout<<find(n)<<endl;
    return 0;
}

你可能感兴趣的:(zoj 1133 - Smith Numbers)