zoukankan      html  css  js  c++  java
  • 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 ;
    }



  • 相关阅读:
    Metrics.NET
    DotNet Multithread
    WebApi框架概述
    RESTful API 概述
    MvcPager分页控件以适用Bootstrap效果
    Windows集群网络负载均衡
    学习Oracle日记(10)-数据类型
    在Eclipse中使用Junit4进行单元测试
    Android--学习笔记--02--AndroidStudio的设置
    Android--学习笔记--01--开发软件安装
  • 原文地址:https://www.cnblogs.com/tigerisland/p/7563760.html
Copyright © 2011-2022 走看看