心如止水
Je n'ai pas le temps
posts - 400,comments - 130,trackbacks - 0
判断一个数是否是Smith数:是否是素数、分解因式、求个位数和。
输出10000以内的Smith数,发现Smith数的密度还是很高的,说明直接模拟应该不会超时。
以下是我的代码:
#include<iostream>
#include
<math.h>
using namespace std;

bool isprime(long x)
{
    
if(x<=1return false;
    
if(x==2return true;
    
for(long i=2;i<=(long)sqrt(x)+1;i++)
      
if(x%i==0)
        
return false;
    
return true;
}

long digitsum(long x)
{
    
long re=0;
    
while(x>0)
    {
       re
+=x%10;
       x
/=10;
    }
    
return re;
}

bool Smith(long x)
{
    
long t=x,m=0,i;
    
    
if(isprime(x)) return false;
    
    
while(t%2==0)
    {
       m
+=2;
       t
/=2;
    }
    i
=3;
    
while(i<=(long)sqrt(t)+1)
    {
       
if(t%i==0)
       {
          m
+=digitsum(i);
          t
/=i;
       }
       
else i+=2;
    }
    
if(t>1)
    {
       m
+=digitsum(t);
    }
    
    
if(m==digitsum(x))
      
return true;
    
return false;
}

int main()
{
    
long T,n;
    
    cin
>>T;
    
    
while(T--)
    {
       cin
>>n;
       
for(long i=n+1; ;i++)
         
if(Smith(i))
         {
            cout
<<i<<endl;
            
break;
         }
    }
return 0;
}
posted on 2010-11-16 22:14 lee1r 阅读(514) 评论(1)  编辑 收藏 引用 所属分类: 题目分类:数学/数论

FeedBack:
# re: UVa 10042 Smith Numbers
2011-03-22 18:50 | orchid
按照你这种方式,x会被分解成质数的乘积形式吗?  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理