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

UVa 10791 (唯一分解) Minimum Sum LCM

时间:2014-12-14 07:02:56      阅读:153      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   io   ar   color   os   sp   for   

题意:

输入n,求至少两个正整数,使得这些数的最小公倍数为n且和最小。

分析:

设n的分解式为bubuko.com,布布扣,很显然bubuko.com,布布扣单独作为一项,和最小。

这里有两个小技巧:

  • 从2开始不断的除n,直到不能整除为止。这样就省去了素数判断的问题,而且缩短了代码量。因为最开始把所有n的2的因数都出去了,后面便不会出现n % 4 == 0的情况,这样除n的都是素数。
  • 从2除n一直到sqrt(n),如果n不为1,则此时除“剩下”的就是n最大的质因数。减少循环次数。
bubuko.com,布布扣
 1 #include <cstdio>
 2 #include <cmath>
 3 
 4 typedef long long LL;
 5 
 6 int main(void)
 7 {
 8     int n, kase = 0;
 9     while(scanf("%d", &n) == 1 && n)
10     {
11         LL ans = 0;
12         int m = sqrt(n + 0.5);
13         int pcnt = 0;
14         
15         if(n == 1)
16         {
17             printf("Case %d: 2\n", ++kase);
18             continue;
19         }
20         
21         for(int i = 2; i <= m; ++i)
22         {
23             if(n % i == 0)
24             {
25                 pcnt++;
26                 int temp = 1;
27                 while(n % i == 0)
28                 {
29                     n /= i;
30                     temp *= i;
31                 }
32                 if(temp > 1) ans += temp;
33             }
34         }
35         if(n > 1)
36         {
37             pcnt++;
38             ans += n;
39         }
40         if(pcnt <= 1) ans++;
41         
42         printf("Case %d: %lld\n", ++kase, ans);
43         
44     }
45     
46     return 0;
47 }
代码君

 

UVa 10791 (唯一分解) Minimum Sum LCM

标签:style   blog   http   io   ar   color   os   sp   for   

原文地址:http://www.cnblogs.com/AOQNRMGYXLMV/p/4162188.html

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