您的位置:首页 > 其它

POJ 1142 Smith Numbers

2012-09-03 15:34 405 查看
题目大意:输入一个8位数内的n,找出一个比n大的、最小的史密斯数:其质数因子的每个数的每位数字之和等于n的每位数字之和

思路:哎~~tie啊,但是常握了一个技巧就OK了。此题花费时间去求出500W内的素数绝对TIE,但是有没有不用求出素数又可以把n的质数因子分离数来的方法呢?

答案在这:就是令k=2,直接令n/k,直到n%k!=0,k++;(当然在此之前,先判断n为合数。)为什么呢?k++?不是吧,这样可以把素数分离?那4,6,8这些不也会被n除掉吗?

答案在这里:哈哈,想起我们的素数筛选了吗?我们的合数n在除到2除不掉的时候才k++,这就是像素数筛选的第二重循环一样,把4,6,8都给筛选掉了,这就是说即使k++会到4,6,8.但是n绝对是除不了的。因为如果能除4,6,8的话,那么就还可以除2,这不是和之前k++的条件矛盾了嘛。呵呵,简单而巧妙吧,素数筛选真是强大啊。

 

program:

  #include <stdio.h>

  #include <math.h>

  #include<iostream>

  bool isPrimer(long d)

  {

      if(d==2||d==3||d==5||d==7||d==11||d==13)

      {

          return true;

      }

      for(int i=2;i<=sqrt((double)d);i++)

     {

         if(d%i==0)

         {

             return false;

         }

     }

     return true;

 }

 int getDataSum(long d)

 {

     int re=0;

     while(d>0)

     {

         re+=d%10;

         d/=10;

     }

     return re;

 }

 int getPrimerSum(long d)

 {

     int re=0;

     for(int i=2;d>1&&i<=sqrt((double)d);)

     {

         if(d%i==0)

         {

             re+=getDataSum(i);

             d/=i;

         }

         else

        {

             i++;

         }

     }

     return re+getDataSum(d);

 }

 

 int main()

 {

     //freopen("in.txt","r",stdin);

     long data;

     while(scanf("%ld",&data)!=EOF&&data!=0)

     {

         while(++data)

         {

             if(!isPrimer(data)&&getDataSum(data)==getPrimerSum(data))

             {

                 printf("%ld\n",data);

                 break;

             }

         }   

     }

     return 1;

   

    

 }

这位大牛的文字解释的更书面语一些:http://blog.csdn.net/taesimple/article/details/6669216
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  numbers math.h