POJ 1142 Smith Numbers

题目大意:输入一个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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值