题目:将一个正质因数分解。例如: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;k<n;k++) {//找出质数最小的质因数k
while(k!=n) {
if(n%k==0) {//如果n<>k,但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<x;i++){
if(x%i==0){
flag=true;
break;
}
}
if(flag){
method(x);//如果是质数,继续分解
}else {
System.out.println(x);
}
}
}