标签:style http color os width art
As this observation is also true for every prime number, Wilansky decided later that a (simple and unsophisticated) prime number is not worth being a Smith number and he excluded them from the definition.
Each test case consists of one line containing a single positive integer smaller than 109.
1 4937774
4937775
题意:如果一个合数的各个数字之和等于该数所有素因子的各个数字之和,则称这个数是Smith数。给出一个n,求大于n的最小的Smith数是多少。
分析:对要判断的数进行素因子分解即可。因为所求数小于 10^9,若一个数是合数,则其素因子至少有一个小于或等于sqrt(10^9),则可先把2 - sqrt(10^9) 之间的素数保存起来。
#include<stdio.h>
#include<string.h>
const int MAXN = 100005;
int vis[MAXN], prime[10000], num;
void get_prime()
{
num = 0;
memset(vis, 0, sizeof(vis));
vis[0] = vis[1] = 1;
for(int i = 2; i < MAXN; i++)
{
if(!vis[i])
{
prime[num++] = i;
for(int j = i + i; j < MAXN; j += i)
vis[j] = 1;
}
}
}
bool is_prime(int x)
{
if(x == 0 || x == 1) return false;
if(x == 2) return true;
if(x % 2 == 0) return false;
for(int i = 3; i * i <= x; i += 2)
if(x % i == 0)
return false;
return true;
}
int sum(int x)
{
int res = 0;
while(x)
{
res += x % 10;
x /= 10;
}
return res;
}
int main()
{
get_prime();
int n, t;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i = n + 1; ; i++)
{
if(is_prime(i))
continue;
int s = 0, tmp = i, tmpsum = sum(i);
for(int j = 0; j < num; j++)
{
if(tmp % prime[j] == 0)
{
while(tmp % prime[j] == 0)
{
s += sum(prime[j]);
tmp /= prime[j];
}
if(is_prime(tmp))
{
s += sum(tmp);
break;
}
}
}
if(tmpsum == s)
{
printf("%d\n",i);
break;
}
}
}
return 0;
}UVA 10042 Smith Numbers(数论),布布扣,bubuko.com
标签:style http color os width art
原文地址:http://blog.csdn.net/lyhvoyage/article/details/37913579