首页 > 代码库 > UVa 10791 (唯一分解) Minimum Sum LCM
UVa 10791 (唯一分解) Minimum Sum LCM
题意:
输入n,求至少两个正整数,使得这些数的最小公倍数为n且和最小。
分析:
设n的分解式为,很显然单独作为一项,和最小。
这里有两个小技巧:
- 从2开始不断的除n,直到不能整除为止。这样就省去了素数判断的问题,而且缩短了代码量。因为最开始把所有n的2的因数都出去了,后面便不会出现n % 4 == 0的情况,这样除n的都是素数。
- 从2除n一直到sqrt(n),如果n不为1,则此时除“剩下”的就是n最大的质因数。减少循环次数。
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
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。