【题意】: 给定一个N,求一个大于N的最小的Smith Numbers,Smith Numbers是一个合数,且分解质因数之后上质因子每一位上的数字之和 等于 其本身每一位数字之和

【解题思路】 :分解质因数的时间复杂度是log,求一个数各个位数上的数字之和时间复杂度是位数,可以直接暴力,递归写非常美观。

【AC代码】

#include <stdio.h>
#include <math.h>
#include <iostream>
using namespace std;
bool isprime(int x)
{
    int m = (int)(sqrt((double)x)+0.5);
    for(int i=2; i<=m; i++)
        if(x%i==0)
            return false;
    return true;
}
int get_digit_sum(int x)
{
    int ans = 0;
    while(x)
    {
        ans+=x%10;
        x/=10;
    }
    return ans;
}
int cut(int x)//分治
{
    if(isprime(x))return get_digit_sum(x);
    int m = (int)(sqrt((double)x)+0.5);
    for(int i=m; i>1; i--)
    {
        if(x%i==0)
        {
            return cut(i)+cut(x/i);
        }
    }
}

int main()
{
    int n;
//    cout<<get_digit_sum(4937774)<<endl;
    while(~scanf("%d",&n)&&n)
    {
        while(n++)
        {
            if(!isprime(n)&&cut(n)==get_digit_sum(n))
            {
                break;
            }
        }
        printf("%d\n",n);
    }
    return 0;
}