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

唯一分解定理(以Minimun Sum LCM UVa 10791为例)

时间:2017-10-10 23:15:15      阅读:165      评论:0      收藏:0      [点我收藏+]

标签:blog   divide   输入   lld   +=   查找   min   bsp   代码   

唯一分解定理是指任何正整数都可以分解为一些素数的幂之积,即任意正整数n=a1^p1*a2^p2*...*ai^pi;其中ai为任意素数,pi为任意整数。

题意是输入整数n,求至少2个整数,使得它们的最小公倍数为n,且这些整数的和最小,输出最小的和。由唯一分解定理可看出当每个ai^pi作为一个单独的整数时最优,只要注意你=1时的答案为2,n的因子只有一种时需要加个1以及n=2^31-1不要溢出即可写出程序。需注意的是应从2开始寻找质因子,因为2是最小的素数,由于习惯从1开始循环则是错误的。

代码如下:

#include<cstdio>
#include<vector>
#include<cstring>
#include<cmath>
using namespace std;

int divide(int& n, int d) {
  int x = 1;
  while(n % d == 0) { n /= d; x *= d; }
  return x;///找出单一质因子的对应幂积
}

int main(){
    int n,kase=0;
    while(~scanf("%d",&n)&&n){
        if(n==1) {printf("Case %d: %d\n",++kase,2);continue;}
        int m = floor(sqrt(n) + 0.5);///floor为取整函数
        long long ans=0;
        int cnt=0;
        for(int i=2;i<=m;i++){///只需要查找是否n能整除2到其的平方根即可判断其是否是素数,因为在判断是否能被小的数整除时就对应判断了其对应的较大的数
            if(n%i==0){
                cnt++;
                ans+=divide(n,i);
            }
        }
        if(n > 1) { cnt++; ans += n; }
        if(cnt <= 1) ans++;
        printf("Case %d: %lld\n",++kase,ans);
    }
    return 0;
}

 

唯一分解定理(以Minimun Sum LCM UVa 10791为例)

标签:blog   divide   输入   lld   +=   查找   min   bsp   代码   

原文地址:http://www.cnblogs.com/sapphirebitter/p/7648127.html

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