zoukankan      html  css  js  c++  java
  • 正质因数分解

    题目:将一个正质因数分解。例如: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原理:证书传递、验证和数据加密、解密过程解析
    java web项目的https配置
    防止表单重复提交的八种简单有效的策略
    nginx.conf
    Java打war包or打jar包
    WarUtil
    MyBatis动态SQL第一篇之实现多条件查询(if、where、trim标签)
    Spring使用注解实现AOP
    Spring添加声明式事务
    spring配置文件拆分策略及方法
  • 原文地址:https://www.cnblogs.com/wangqilong/p/9417541.html
Copyright © 2011-2022 走看看