题目链接 : http://poj.org/problem?id=1142
题目大意 : 给定一个N,求一个大于N的最小的Smith Numbers,Smith Numbers是一个合数,且分解质因数之后上质因子每一位上的数字之和 等于 其本身每一位数字之和
思路 :分解质因数的时间复杂度是log,求一个数各个位数上的数字之和时间复杂度是位数,可以直接暴力,递归写非常美观
code:
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
#define foru(i, a, b) for (int i=a; i<=b; i++)
#define ford(i, a, b) for (int i=a; i>=b; i--)
#define N 200
#define M 11000
int n;
bool pri(int x){
foru(i, 2, sqrt(x))
if (x%i == 0) return 0;
return 1;
}
int sum(int x){
if (! x) return x;
return x%10 + sum(x/10);
}
int get(int x){
if (pri(x)) return sum(x);
ford(i, sqrt(x), 2)
if (x%i == 0 && pri(i)) return get(i) + get(x/i);
}
int main(){
// freopen("P.txt", "r", stdin);
while (scanf("%d", &n) != EOF ){
if (! n) break;
while (n ++){
if (!pri(n) && sum(n) == get(n))
break;
}
printf("%d\n", n);
}
return 0;
}