题意 史密斯数定义:一个数按十进制位拆分求和 == 这个数分解质因数后,所有质因数十进制位拆分求和的和,但该数不能使质数。然后给你一个数n,问你比它大的最小史密斯数是几。
思路 纯暴力即可,但要注意排除质数,并且是大于n不是大于等于n。
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstdio>
#include <vector>
#include <queue>
#include <algorithm>
#include <cstring>
#include <string>
#include <cstdlib>
#include <map>
using namespace std;
#define I64_MAX 9223372036854775807
typedef long long ll;
const double pi=acos (-1.0);
const double eps=1e-8 ;
//const ll INF=(I64_MAX)/2;
//#pragma comment(linker, "/STACK:102400000,102400000")
const int inf=0x3f3f3f3f ;
#define maxx(a) memset(a, 0x3f, sizeof(a))
#define zero(a) memset(a, 0, sizeof(a))
#define FILL(a,b) memset(a, b, sizeof(a))
#define REP(i,a,b) for(i=a;i<b;i++)
#define rep(i,n) REP(i,0,n)
#define srep(i,n) for(i = 1;i <= n;i ++)
#define snuke(c,itr) for( __typeof((c).begin()) itr=(c).begin();itr!=(c).end();itr++)
#define MP make_pair
#define fi first
#define se second
typedef pair <int, int> PII;
typedef pair <ll, ll> PX;
typedef pair<int,ll> PIL;
#define MAX
ll n;
vector<ll> vec;
int getSum(ll x)
{
int res = 0;
while(x > 0)
{
res += (int)(x % (ll)10);
x /= 10;
}
return res;
}
int fenJie(ll x,vector<ll>& v)
{
ll i = 2;
v.clear();
while(i*i <= x)
{
while(x%i == 0)
{
x /= i;
v.push_back(i);
}
i++;
}
if(x > 1) //x is a zhiShu
{
v.push_back(x);
}
return v.size();
}
int main ()
{
// freopen("E:\\input.txt" ,"r", stdin);
// freopen ("E:\\out.txt","w",stdout);
ll i;
int j;
while(scanf("%lld",&n) != EOF)
{
if(n==0)
break;
for(i=n+1;1;i++)
{
int sum1 = 0,sum2 = 0;
sum1 = getSum(i);
fenJie(i,vec);
if(vec.size() == 1)
continue;
for(j=0;j<vec.size();j++)
{
sum2 += getSum(vec[j]);
}
if(sum1 == sum2)
{
printf("%lld\n",i);
break;
}
}
}
return 0;
}