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