题目:将一个正质因数分解。例如:90=2*3*3*5.
* 程序分析:对n进行质因数分解,应先找到一个最小的质数k,然后按下述步骤: 1.如果这个质数恰等于n,则说明分解质因数已经结束,打印出即可 2.如果n<>k,但n能被k整除,则打印出k的值,并利用n除以k的商,作为新的正整数,重复执行第一步 3.如果n不能被k整除,则用k+1作为k的值,重复执行第一步按照上面程序分析思想实现
package com.math.forth;import java.util.Scanner;/** * 将一个正质因数分解。例如:90=2*3*3*5. * 程序分析:对n进行质因数分解,应先找到一个最小的质数k,然后按下述步骤: * 1.如果这个质数恰等于n,则说明分解质因数已经结束,打印出即可 * 2.如果n<>k,但n能被k整除,则打印出k的值,并利用n除以k的商,作为新的正整数,重复执行第一步 * 3.如果n不能被k整除,则用k+1作为k的值,重复执行第一步 * @author wql * */public class Method04 { public static void main(String[] args) { System.out.print("请输入一个质数:"); Scanner sc=new Scanner(System.in); int n=sc.nextInt(); System.out.print(n+"="); method(n); } public static void method(int n){ boolean flag=false; //判断该数有没有质因数标志 for(int k=2;kk,但n能被k整除,则打印出k的值 System.out.print(k+"*"); flag=true; n=n/k; }else { break; } } } //如果n不能被k整除,则打印出n的值 if(flag){ System.out.println(n); }else{ System.out.println("1*"+n); } }}
看到这个题目,我的想法是递归调用,实现如下
package com.math.forth;import java.util.Scanner;/** * @author wql * */public class Method04 { public static void main(String[] args) { System.out.print("请输入一个质数:"); Scanner sc=new Scanner(System.in); int n=sc.nextInt(); System.out.print(n+"="); method(n); } public static void method(int num){ boolean flag=false; for(int i=2;i<=num/2;i++){ if(num%i==0) { System.out.print(i+"*"); int x=num/i; method(x);//去递归调用,但递归调用结束,for循环给终止 flag=true; break; } } if(!flag){ System.out.print("1*"+num); } } }
下面相对繁琐的方法,可能比较好理解
package com.math.forth;import java.util.Scanner;/** * @author wql * */public class Method04 { public static void main(String[] args) { System.out.print("请输入一个质数:"); Scanner sc=new Scanner(System.in); int n=sc.nextInt(); System.out.print(n+"="); method2(n); } public static void method(int num){ int x=0; for(int i=2;i<=num/2;i++){ if(num%i==0) { System.out.print(i+"*"); x=num/i; break; } } if(x==0){ //如果此数是个素数,只能被1和其自身整除 System.out.print("1*"+num); }else{ isNum(x); } } /** * 判断是不是质数 * @param x */ public static void isNum(int x) { boolean flag=false; for(int i=2;i