码迷,mamicode.com
首页 > 其他好文 > 详细

uva10791 (分解质因数)

时间:2015-05-09 22:01:13      阅读:204      评论:0      收藏:0      [点我收藏+]

标签:

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1732

给定我们一个n, 要找到两个数的集合,使得这些书的最小公倍数(LCM)为n,由于有很多这样的集合,我们要选出总和最小的,而且也只要输出总和就行了

 

数的最大公倍数是怎么求的?  是每个质因数指数最大的那个相乘而来的。

通过最小公倍数的求法,我们可以看出最小公倍数取决于每个质因子在各个数中的最高次。

如果要总和最小,我们要把同一个质因数放到一个整数里面

因为a*b>a+b

比如12 = 3 * 2^2    a = 3, b = 2             a * b > a + b   即2*3 > 2 + 3

所以最终的结果是3 * 4 = 12,   此时和最小,为7

技术分享
 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <stdlib.h>
 4 #include <algorithm>
 5 #include <iostream>
 6 #include <queue>
 7 #include <stack>
 8 #include <vector>
 9 #include <map>
10 #include <set>
11 #include <string>
12 #include <math.h>
13 using namespace std;
14 #pragma warning(disable:4996)
15 typedef long long LL;                   
16 const int INF = 1<<30;
17 /*
18 
19 */
20 int main()
21 {
22     LL n, i, m, k = 1;
23     LL ans;
24     while (scanf("%lld", &n), n)
25     {
26         int nn = n;
27         ans = 0;
28         m = sqrt(n) + 0.5;
29         int cnt = 0;
30         for (i = 2; i <= m; ++i)
31         {
32             if (n%i == 0)
33             {
34                 int t = 1;
35                 while (n%i == 0)
36                 {
37                     t *= i;
38                     n /= i;
39                 }
40                 ans += t;
41                 cnt++;
42             }
43         }
44         if (n > 1)
45         {
46             ans += n;
47             cnt++;
48         }
49         if (cnt == 1)//这是只有单独一个数的情况
50             ans += 1;
51         else if (cnt == 0)//这是n为1的情况
52             ans += 2;
53         printf("Case %lld: %lld\n", k++,ans);
54     }
55     return 0;
56 }
View Code

 

uva10791 (分解质因数)

标签:

原文地址:http://www.cnblogs.com/justPassBy/p/4491015.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!