UVA 10042 Smith Numbers 数论

来源:互联网 发布:美国经济数据一览表 编辑:程序博客网 时间:2024/05/22 08:03
#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 numbercflag = 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 ;}