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;
}
【解题思路】 :分解质因数的时间复杂度是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;
}
相关文章推荐
- 去除AndroidStudio中libpng关于iCCP的警告
- POJ 1182 食物链(分层并查集)
- 代理ARP配置实战
- jsp中时间日期算法集合
- 步骤比较细致的 圣杯布局说明
- 关于视图的生命周期
- C++ 虚函数表
- c#中using System.Runtime.Serialization.Json;不能引用
- JXLS模板导出多个sheet文件
- 一种合适的智能优化算法
- Apache多端口多目录配置方法
- Symfony2创建页面实例详解
- CENTOS关闭防火墙
- java 回调机制分为:异步回调 同步回调
- docker 使用笔记
- 理解Python中的With语句
- JavaScript之数据类型(转)
- Spark on Yarn可能遇到的问题
- Android----UI
- Django基于类的编辑视图和Mixins