【题意】: 给定一个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;
}