• HDU5428 The Factor【分解质因子】


    问题链接HDU5428 The Factor

    题意简述:对于给出的一组数 找出这组数乘积中的一个最小的至少三个质因子的数。

    问题分析

    其实就是最小的两个素数因子的乘积。

    将各个数分别进行质因子分解,将质因子保存在数组中,排序后找到最小的两个乘积即可。

    程序说明

    给出2个C++语言程序,前一个程序使用变量maxfact记录已经找到的最大因子,限制质因子分解计算,也许会快一些。


    AC的C++语言程序如下

    /* HDU5428 The Factor */
    
    #include <iostream>
    #include <algorithm>
    
    using namespace std;
    
    const int N = 10000;
    unsigned int fact[N], maxfact;
    int fcount;
    
    void solve(unsigned int x)
    {
        for(int i=2; i*i<=x; i++) {
            if(i >= maxfact && fcount >= 2)
                break;
    
            while(x % i == 0) {
                fact[fcount++] = i;
                x /= i;
    
                if(i > maxfact)
                    maxfact = i;
            }
        }
    
        if(x > 1) {
            if(x >= maxfact && fcount >= 2)
                ;
            else {
                fact[fcount++] = x;
                if(x > maxfact)
                    maxfact = x;
            }
        }
    }
    
    int main()
    {
        int t, n;
        unsigned int a;
    
        cin >> t;
        while(t--) {
            cin >> n;
    
            fcount = 0;
            maxfact = 0;
            while(n--) {
                cin >> a;
                solve(a);
            }
    
            sort(fact, fact + fcount);
    
            if(fcount < 2)
                cout << -1 << endl;
            else
                cout << (long long)fact[0] * fact[1] << endl;
        }
    
        return 0;
    }


    AC的C++语言程序如下

    /* HDU5428 The Factor */
    
    #include <iostream>
    #include <algorithm>
    
    using namespace std;
    
    const int N = 10000;
    unsigned int fact[N] ;
    int fcount;
    
    void solve(unsigned int x)
    {
        for (unsigned int i=2; i*i<=x; i++) {
            while(x % i == 0) {
                fact[fcount++] = i;
                x /= i ;
            }
        }
        if (x > 1)
            fact[fcount++] = x;
    }
    
    int main()
    {
        int t, n;
        unsigned int a;
    
        cin >> t ;
        while(t--) {
            cin >> n ;
    
            fcount = 0 ;
            while(n--) {
                cin >> a;
                solve(a);
            }
    
            sort(fact, fact + fcount);
    
            if (fcount < 2)
                cout<< -1 << endl;
            else
                cout << (long long) fact[0] * fact[1] << endl;
        }
    
        return 0 ;
    }



  • 相关阅读:
    2011年9月11日的最后几分钟开始学习Zend freamework
    PHP常用的调试技术 一周的时间正在整理
    二叉树最近共同祖先问题
    最近一段时间的思考
    字符编码笔记:ASCII,Unicode和UTF8
    node简介
    如何影响别人
    HTTP协议状态码详解(HTTP Status Code)
    jQuery常见的50种用法
    php上传多张图片
  • 原文地址:https://www.cnblogs.com/tigerisland/p/7563760.html
Copyright © 2020-2023  润新知