• WUSTOJ 1285: Factors(Java)


    1285: Factors

    参考

      hadis_fukan的博客——wustoj 1285 Factors

    题目

      输入一个数n,找出1~n之间(包括1,n)的质因子最多的数(x)的质因子个数(f[x])。更多内容点击标题。

    分析

      很明显,这题的结果是可以直接算出来的,保存到数组中。通过题目,就可以了解到,我们需要算出2-2000000之间所有的数的质因子的个数。这样才能找出1~n之间质因子最多的数x。这里你可能想是不是需要先将质数单独求出来。那是完全没必要的。我们只需要在求因子的过程中,顺带着区分出质数即可。并且合理利用已经计算出的质数。

    测试数据

     输入

    2
    3
    4
    5
    6
    7
    8
    9
    

     输出

    1
    1
    2
    2
    2
    2
    3
    3
    

    代码

    /**
     * time 1148ms
     * @author PengHao
     * @version 1.0
     * @date 2019-05-03 上午9:34:02
     * Environment:	Windows 10
     * IDE Version:	Eclipse 2019-3
     * JDK Version:	JDK1.8.0_112
     */
    
    import java.io.BufferedInputStream;
    import java.util.ArrayList;
    import java.util.Scanner;
    
    public class Main {
    	private Scanner sc;
    	/**
    	 * @Field <code>MAXN</code> N的最大值
    	 */
    	private static final int MAXN = 2000000;
    	/**
    	 * @Field <code>prime</code> 保存素数
    	 */
    	private ArrayList<Integer> prime;
    	/**
    	 * @Field <code>f</code> x的质因子的个数为f[x]
    	 */
    	private byte[] f;
    	/**
    	 * @Field <code>maxF</code> 1-n之间质因子最多的数的质因子个数
    	 */
    	private byte[] maxF;
    
    	public Main() {
    		sc = new Scanner(new BufferedInputStream(System.in));
    		initF(); // 初始化f
    		initMaxF(); // 初始化maxF
    		int n;
    		while (sc.hasNext()) {
    			n = sc.nextInt();
    			System.out.println(maxF[n]);
    		}
    		sc.close();
    	}
    
    	/**
    	 * Initialize the array f.
    	 */
    	private void initF() {
    		prime = new ArrayList<Integer>(); // 保存素数
    		f = new byte[MAXN + 1]; // 记录质因子个数
    		boolean iPrime; // true 质数,false 非质数
    		for (int i = 2; i <= MAXN; i++) {
    			iPrime = true; // 默认i是质数
    			for (int j : prime) { // 取出一个质数j
    				// 如果j的平方大于i,那么j肯定不是i的因子
    				// 因此i就是质数
    				if (j * j > i) {
    					break;
    				}
    				if (0 == i % j) { // 如果j是i的因子
    					iPrime = false; // 那么i是不是质数
    					// i的质因子个数等于另一个因子的质因子个数加1
    					f[i] = (byte) (f[i / j] + 1);
    					break;
    				}
    			}
    			if (iPrime) { // 如果i是质数
    				prime.add(i); // 将i加到质数数组列表中
    				f[i] = 1; // 并且质数i的质因子个数为1
    			}
    		}
    	}
    
    	/**
    	 * Initialize the array maxF.
    	 */
    	private void initMaxF() {
    		maxF = new byte[MAXN + 1];
    		byte max = 0; // 记录质因子个数的最大值
    		for (int i = 2; i <= MAXN; i++) {
    			if (f[i] > max) { // 当前数i的质因子个数比max大
    				max = f[i]; // 更新最大值
    			}
    			maxF[i] = max; // 将最大值保存到数组中
    		}
    	}
    
    	public static void main(String[] args) {
    		new Main();
    	}
    }
    

    写在最后:

    1. 如需转载,请于首页注明链接形式的wowpH的博客——WUSTOJ 1285: Factors(Java)
    2. 代码原创,如需公开引用,不能删除首行注释(作者,版本号,时间等信息)。
    3. 如果有疑问欢迎评论留言,尽量解答。

  • 相关阅读:
    os.path.split()、os.path.realpath()和os.path.join()
    我终于也有了自己的博客网站
    (Bug修复)C#爬虫,让你不再觉得神秘
    DevExpress弹框、右键菜单、Grid的使用
    Linux 宝塔部署 ASP.NET Core 应用
    C#高级特性(反射)
    WPF 的内部世界(Binding)
    WPF 的内部世界(控件与布局)
    Layui事件监听(表单和数据表格)
    (待更新)tensorboard [Fatal error in launcher: Unable to create process using]
  • 原文地址:https://www.cnblogs.com/wowpH/p/11060802.html
Copyright © 2020-2023  润新知