您的位置:首页 > 其它

UVA 10042 Smith Numbers 数论

2012-05-26 09:04 281 查看
#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdio>
#include <algorithm>
#include <queue>
using namespace std ;

const int MAXN = 40000 ;
int prime[MAXN] ;
bool isPrime[MAXN] ;
int priLen ;
int getp[31] ;
bool cflag ;

void getPrime ()  //晒素数
{
int i, j ;
prime[0] = 2 ;
priLen = 1 ;
for (i = 4; i < MAXN; i += 2)
isPrime[i] = true ;
for (i = 3; i < MAXN; i += 2)
{
if (!isPrime[i])
{
int tp = 2 * i ;
prime[priLen ++] = i ;
while (tp < MAXN)
{
isPrime[tp] = true ;
tp += i ;
}
}
}
}

void judge (int val)
{
int ans, cnt, i, j, tp, tmp ;
if(val < MAXN)  //如果没有这一步,输入1,结果输出是2,因为2在这个judge里被分解了
{
if(!isPrime[val])
return ;
}
cnt = 0 ;
ans = 0 ;
tp = val ;
for (i = 0; i < priLen; i ++)
{
if (prime[i] > val)
break ;
if (val % prime[i] == 0)
{
while (val % prime[i] == 0)  //求素数各个位数的值
{
val /= prime[i] ;
tmp = prime[i] ;
while (tmp)
{
cnt += (tmp % 10) ;
tmp /= 10 ;
}
}
}
}
if (val == tp)  //本身就是素数,直接返回结果
return ;
else if(val != 1)  //存在比所筛的素数还更大的素数,那就得把他的每个位上的数值加进去
{
while (val)
{
cnt += (val % 10) ;
val /= 10 ;
}
}

while (tp)
{
ans += (tp % 10) ;
tp /= 10 ;
}

if (ans == cnt)  //是Smith number
cflag = true ;
return ;
}

int main ()
{
int i, tcase, n ;

getPrime () ;

scanf("%d",&tcase);
while(tcase --)  //因为smith number的间隔较小,所以直接暴力求
{
scanf("%d",&n);
n ++;
cflag = false;
while(1)
{
judge(n);
if(cflag) break;
n ++;
}
printf("%d\n",n);
}
return 0 ;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: