题意:给定一个N,求一个大于N的最小的Smith Numbers,Smith Numbers是一个合数,且分解质因数之后上质因子每一位上的数字之和 等于 其本身每一位数字之和(别的博客偷的题意)
思路:主要是分治:分解成质因子使用递归即可。
#include<cstdio> #include<cmath> // 检测素数 bool is_prime(int n) { for (int i = 2; i*i <= n;++i) if (n%i == 0){ return 0; } return 1; } //数位 int sumfun(int n) { int ans = 0; while (n){ ans += n % 10; ; n /= 10; } return ans; } //分治 int che(int n) { if (is_prime(n))return sumfun(n); else { int m = (int)sqrt(n + 0.5); for (int i = m; i >1; --i) { if (n%i == 0) return che(i) + che(n / i); } } } int main() { int n; while (scanf("%d", &n)!=EOF && n) { while (n++) { if (!is_prime(n)&&sumfun(n) == che(n)){ printf("%d ", n); break; } } } }