版主 您好:第一题代码- package test2;
- import java.io.BufferedReader;
- import java.io.InputStreamReader;
- import java.util.ArrayList;
- import java.util.List;
- /*
- * 需求:1、键盘录入一个正整数,将其分解质因数。如:输入30,打印出30=2*3*5。
- * */
- /*
- * 思路:
- * (1). 键盘读取一个正整数,之后产生[2,该正整数]之间所有的质数 存放到一个质数列表中
- * (2). 循环判断这些质数有哪些可以整除刚才录入的正整数
- * */
- public class Test1 {
- public static void main(String[] args) throws Exception{
- //1.键盘录入数字
- BufferedReader bufr =new BufferedReader(new InputStreamReader(System.in));
- System.out.println("请您输入一个正整数:");
- String numLine =bufr.readLine();
- //检验用户输入的数字是不是数字
- int number =0;
- try{
- number =Integer.parseInt(numLine);
- }catch(NumberFormatException nfe){
- System.out.println("对不起,您输入的内容含有非数字字符");
- return;
- }
-
- if(number <=0){
- System.out.println("您输入的数字不是正整数,请您重新输入...");
- return;
- }
-
- //现在的数字一定是正整数
- //2.产生[2, 该正整数]范围的质数列表
- //获取该正整数的不重复的质因数列表 e.g.12质因数有[2, 3]
- List<Integer> primes =generatePrimeFacotrs(number);
-
- //3.在产生的质因数的列表中,计算出键盘输入的正整数含有每个质因数的个数
- List<Integer> primesDetails =getPrimeDetails(primes, number);
-
- //4.打印输出该正整数的列表
- printPrimeFactorsStr(primes, primesDetails, number);
- }
-
- //打印输出改该正整数的列表
- private static void printPrimeFactorsStr(List<Integer> primes, List<Integer> primesDetails, int number) {
- StringBuilder sBuilder =new StringBuilder();
- sBuilder.append(number+"=");
-
- int primeFactor =0;
- int pCount =0;
-
- for(int i =0; i<primes.size(); i++){
- primeFactor =primes.get(i);
- pCount =primesDetails.get(i);
-
- for(int j =0; j<pCount -1; j++)
- sBuilder.append(primeFactor+"*");
-
- if(i <primesDetails.size()-1)
- sBuilder.append(primeFactor+"*");
- else
- sBuilder.append(primeFactor);
- }
- System.out.println("质因数分解结果:"+ sBuilder.toString());
- }
- //获取每个质因数在键盘输入的数中所含的具体个数
- private static List<Integer> getPrimeDetails(List<Integer> primeFactors, int number) {
- List<Integer> pDetails =new ArrayList<Integer>();
-
- for(int primeIndex =0; primeIndex <primeFactors.size(); primeIndex++){
- int pCount =0;
- int primeFactor =primeFactors.get(primeIndex);
-
- //一直用同一个质因数去整数该整数 一旦除到余数不为0的时候 表示这个整数里面不再含有这个质因数的成分
- while(number%primeFactor ==0){
- //整除一次,就把对应的质因数的次数变量pCount自加
- pCount++;
-
- //更新该整数
- number =number/primeFactor;
- }
- pDetails.add(pCount);
- // System.out.println(primeFactors.get(primeIndex) +"...."+ pCount);
- }
-
- return pDetails;
- }
- //产生[2, 该正整数]范围内的质数列表
- private static List<Integer> generatePrimeFacotrs(int number) {
- List<Integer> primes =new ArrayList<Integer>();
- for(int i=2; i<=number; i++){
- //如果是质数并且能被传入的整数number整除 那么 这个数i一定是number的一个质因数
- if(isPrime(i)&&(number%i ==0))
- primes.add(i);
- }
- // System.out.println(primes);
- return primes;
- }
- //判断一个数是否为素数
- private static boolean isPrime(int num){
- boolean isPrime =true;
- //--根据素数的定义 :在一个大于1的自然数中,除了1和此整数自身外,不能被其他自然数整除的数
- //--要对给定的数 i 判定除了1和自身(num)以外的整数 是不是有能被i整除的
- for(int i=2; i<num; i++){
- if(num%i==0){ //如果能被整除 整除标记isPrime标记为false 表示不是素数
- isPrime =false;
- //开区间(1, i)之间一旦有一个数能整除i
- //--就表示i不是素数 直接跳出 不用继续进行判断 节省计算量
- break;
- }
- //如果(1, i)之间都没有能整出i的数出现, 就表示这个数i是素数 要更新isPrime
- isPrime =true;
- }
- return isPrime;
- }
- }
复制代码 运行结果如图:
|
|