UVa 10791 最小公倍数的最小和(唯一分解定理)

https://vjudge.net/problem/UVA-10791

题意:

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

思路:

首先对n进行质因数分解,举个例子来说,12=2×2×3,最小和为7,也就是4和3,相同质因子必须放在一起,也就是说这里的2个2必须合在一起变成4,不然2和3会有更小的公倍数6。

 1 #include <iostream>  
 2 #include <cstring>  
 3 #include <algorithm>   
 4 #include <vector>
 5 #include <queue>
 6 #include <cmath>
 7 using namespace std;
 8 
 9 long long n;
10 
11 int main()
12 {
13     //freopen("D:\input.txt", "r", stdin);
14     int kase = 0;
15     while (~scanf("%d", &n) && n)
16     {
17         int temp;
18         int ret = 0;
19         long long ans = 0;
20         int m = sqrt(n + 0.5);
21         for (int i = 2; i <= m && n > 1; i++)
22         {
23             if (n%i == 0)
24             {
25                 temp = 1;
26                 while (n%i == 0)
27                 {
28                     temp *= i;
29                     n /= i;
30                 }
31                 ans += temp;
32                 ret++;
33             }
34         }
35         if (n > 1)
36         {
37             ans += n;
38             ret++;
39         }
40         while (ret < 2)
41         {
42             ans++;
43             ret++;
44         }
45         printf("Case %d: %lld
", ++kase, ans);
46     }
47 }
原文地址:https://www.cnblogs.com/zyb993963526/p/6668979.html