POJ 1142 (暴力加分治)

来源:互联网 发布:海康域名注册平台 编辑:程序博客网 时间:2024/06/03 08:04
【题意】:给定一个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;}


1 0