Minimum Sum LCM UVA

来源:互联网 发布:mysql 事务 编辑:程序博客网 时间:2024/06/10 20:01

Think:
1知识:唯一分解定理++
2题意分析:
1>n == 1的情况和n 是素数的情况
2>n是单质因子的情况
3>当n = 2147483647时是一个素数,结果应该输出2147483648,超过int范围,应该思考用long long 来存储
4>时间复杂度优化问题,如果单纯遍历n,会超时

唯一分解定理(算术基本定理)百度链接
vjudge题目链接
建议参考博客链接

以下为Accepted代码

/*唯一分解定理:一个正整数等于m个质因子(a1, a2, a3, ..., am)的ki次方(k1, k2, k3, ..., km)的乘积;*/#include <cstdio>#include <cstring>#include <cmath>using namespace std;int main(){    int k, n, m, i, cnt;    long long sum;    k = 1;    while(scanf("%d", &n) && n){        printf("Case %d: ", k++);        sum = 0, cnt = 0;        m = sqrt((double)n);        for(i = 2; i <= m; i++){            int v = 1;            while(n%i == 0){                v *= i;                n /= i;            }            if(v != 1){                sum += v;                cnt++;            }            ///why not judge i is Prime factor ? :Eratosthenes Sieve method Thought        }        if(cnt == 0)///n本身作为一个素数||n == 1的情况            sum = (long long)n + 1;        else if(n != 1)///余下一个大于sqrt((double)n)的质因子            sum += n;        else if(cnt == 1 && n == 1)///单质因子情况            sum += 1;        printf("%lld\n", sum);    }    return 0;}
原创粉丝点击