题目描述
对N!进行质因子分解。
输入格式
输入数据仅有一行包含一个正整数N,N<=10000。
输出格式
输出数据包含若干行,每行两个正整数p,a,中间用一个空格隔开。表示N!包含a个质因子p,要求按p的值从小到大输出。
输入输出样例
输入
10
输出
2 8
3 4
5 2
7 1
说明/提示
10!=3628800=(2^8)(3^4)(5^2)*7

题目思路:
设置三个数据结构: 1、array是存放数据[1,2,3,4,5,6,7,8,9...n]
2、prime是存放2-n的质数[2,3,5,7,11,17,19...n]
3、ans是存放答案[prime - number]
这道题的主要思路是让样本数据array每一次对prime质数进行取余后记录次数
以10为例
array:[1,2,3,4,5,6,7,8,9,10]
prime:[2,3,5,7]
走第一遍,让array每个数取余2,得到array:[1,1,3,1,5,3,7,1,9,5],此时2计数为8
走第二遍,让array每个数取余3,得到array:[1,1,1,1,5,1,7,1,1,5],此时3计数为4
走第三遍,让array每个数取余5,得到array:[1,1,1,1,1,1,7,1,1,1],此时5计数为2
走第四遍,让array每个数取余7,得到array:[1,1,1,1,1,1,1,1,1,1],此时7计数为1
得到ans:[[1 8],[3,4],[5,2],[7,1]]

import java.io.*;
import java.util.ArrayList;
public class Main18 {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        int[] array = new int[n+1];//array用来存放1-10000的数字
        for(int i=1;i<=n;i++) {
            array[i]=i;
        }//[1,2,3,4,5,6,7,8,9,10...]
        ArrayList<String> prime = new ArrayList();//prime用于存放质数
        ArrayList<String> ans = new ArrayList();//ans用于存放结果 "质数-数量"
        for(int i=2;i<=n;i++) {//这里是简单地进行质数判断
            int sign=0;
            for(int j=2;j<=Math.sqrt(i);j++) {
                if(i%j==0) {sign=1;break;}
            }
            if(sign==0) {
                prime.add(i+"");
            }
        }
        for(int j=0;j<prime.size();j++) {//2 3 5 7 11    prime是质数 这一层是用来循环质数的
            int p = Integer.parseInt(prime.get(j));
            int num = 0;
            for(int i=2;i<array.length;) {//0 1 2 3 4 5 6   array是样本数据 这一层是让每一个样本数据对每一个质数进行取余
                if(array[i]%p==0) {
                    array[i]/=p;
                    num+=1;
                }else {
                    i++;
                }
            }
            ans.add(p+" "+num);//走完一圈将答案加入ans
        }
        for (int i = 0; i < ans.size(); i++) {
            System.out.println(ans.get(i));
        }
    }

}