题目描述
对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)); } } }