POJ 1142 Smith Numbers(分治法+质因数分解)

http://poj.org/problem?id=1142

题意:

给出一个数n,求大于n的最小数,它满足各位数相加等于该数分解质因数的各位相加。

思路:
直接暴力。

 1 #include <iostream>
 2 #include <cstring>
 3 #include <algorithm>
 4 #include <vector>
 5 #include <queue>
 6 #include <cmath>
 7 using namespace std;
 8
 9 int n;
10
11 int cacl(int x)
12 {
13     int sum = 0;
14     while (x)
15     {
16         sum += x % 10;
17         x /= 10;
18     }
19     return sum;
20 }
21
22 bool isprime(int x)
23 {
24     int m = sqrt(x + 0.5);
25     for (int i = 2; i <= m; i++)
26     {
27         if (x%i == 0)  return false;
28     }
29     return true;
30 }
31
32 int solve(int x)
33 {
34     if (isprime(x))
35         return cacl(x);
36     else
37     {
38         int m = sqrt(x + 0.5);
39         for (int i = m; i >1;i--)
40         if (x%i == 0)
41             return solve(i) + solve(x / i);
42     }
43 }
44
45 int main()
46 {
47     //freopen("D:\\input.txt", "r", stdin);
48     while (~scanf("%d", &n) && n)
49     {
50         for (int i = n + 1;; i++)
51         {
52             if (!isprime(i) && cacl(i) == solve(i))
53             {
54                 printf("%d\n", i);
55                 break;
56             }
57         }
58     }
59     return 0;
60 }
时间: 2024-10-12 04:08:38

POJ 1142 Smith Numbers(分治法+质因数分解)的相关文章

POJ 1845 Sumdiv#质因数分解+二分

题目链接:http://poj.org/problem?id=1845 关于质因数分解,模板见:http://www.cnblogs.com/atmacmer/p/5285810.html 二分法思想:选定一个要进行比较的目标,在区间[l,r]之间不断二分,直到取到与目标相等的值. #include<iostream> #include<cstdio> #include<cstring> using namespace std; typedef long long ll

Smith Numbers(分解质因数)

Smith Numbers Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 14173   Accepted: 4838 Description While skimming his phone directory in 1982, Albert Wilansky, a mathematician of Lehigh University,noticed that the telephone number of his b

POJ 2429 long long 质因数分解

GCD & LCM Inverse Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 16206   Accepted: 3008 Description Given two positive integers a and b, we can easily calculate the greatest common divisor (GCD) and the least common multiple (LCM) of a

poj 3714 Raid 分治法求平面最近点对

题意: 给平面上的n个点,求两点间的最短距离. 分析: 分治法,保存点用vector会tle... 代码: //poj 3714 //sep9 #include <iostream> #include <algorithm> #include <cmath> using namespace std; const double INF=1e50; struct P { double x,y; int type; }p[240000],b[240000]; bool cmp

ACM/ICPC算法训练 之 分治法入门(画图模拟:POJ 2083)

题意:大致就是要求画出这个有规律的Fractal图形了= = 例如 1 对应 X 2 对应 X  X   X    X  X 这个题是个理解分治法很典型的例子(详情请参见Code) 分治法:不断缩小规模,以致把整个大问题分解为若干个可以直接处理的小问题,一般通过递归调用实现,可以用极简代码完成高复杂的工作,但空间与时间占用也相对较大. 1 //分治法画图 2 //Memory:880K Time:16 Ms 3 #include<iostream> 4 #include<cstring&

UVA 11582 - Colossal Fibonacci Numbers!(数论)(分治法幂取模)

巨大的斐波那契数! 题目大意:斐波那契数列f[N],给你a,b,n,求f[a^b]%n. 思路:数论题.f[a^b]%n是有周期的,我们求出来这个周期后就可以将简化成f[(a%周期)^b]%周期运用分治法幂取模. 注意用unsigned long long(貌似是 long long的二倍),不然会溢出,又学了一招... 不知道哪的bug,一直改不对,一直,后来捡来别人的和自己一样的代码一改就对了,,, #include<iostream>//UVA #include<cstdio>

A - Smith Numbers POJ

While skimming his phone directory in 1982, Albert Wilansky, a mathematician of Lehigh University,noticed that the telephone number of his brother-in-law H. Smith had the following peculiar property: The sum of the digits of that number was equal to

分治法——算法总结二

分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同.求出子问题的解,就可得到原问题的解. 分治法解题的一般步骤: (1)分解,将要解决的问题划分成若干规模较小的同类问题: (2)求解,当子问题划分得足够小时,用较简单的方法解决: (3)合并,按原问题的要求,将子问题的解逐层合并构成原问题的解. 简而言之,分治法的设计思想就是,将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之. 问题分析:以归并排序为例子,将待排

专题:分治法

分治法(Divide and Conquer) 作为五大算法之一的分治法,可算是最早接触的一种算法.分治法,与其说是一种算法,不如将其称为策略来的更贴切一些.算法的思想就是将大问题分成小问题,并解决小问题之后合并起来生成大问题的解. 分治法的精髓: 分--将问题分解为规模更小的子问题: 治--将这些规模更小的子问题逐个击破: 合--将已解决的子问题合并,最终得出“母”问题的解: 分治法的作用,自然是让程序更加快速地处理问题.比如一个n的问题分解成两个n/2的问题,并由两个人来完成,效率就会快一些