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 ;
    }



  • 相关阅读:
    ACE 资源
    为什么在VC6中TRACE不能输出信息?
    实例源码Android智能家居系统
    项目源码Android音乐播放器
    实例源码Android捕鱼达人经典游戏
    精品教程NDK环境搭建(1)CYGWIN的安装
    实例源码Android人脸识别技术(眼睛位置)
    精品教程NDK基础例子,编译.SO文件
    项目源码Android高清壁纸应用
    精品教程Android中通过NDK使用OpenCV库
  • 原文地址:https://www.cnblogs.com/tigerisland/p/7563760.html
Copyright © 2011-2022 走看看