#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 ;
}