正质因数分解

题目:将一个正质因数分解。例如: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);
        }
    }
}
原文地址:https://www.cnblogs.com/wangqilong/p/8279776.html