您的位置:首页 > 其它

POJ 1142 (暴力加分治)

2016-03-18 11:33 211 查看
【题意】:给定一个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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: