当前位置: 首页 > news >正文

正质因数分解

题目:将一个正质因数分解。例如: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

相关文章:

  • 110. Balanced Binary Tree
  • 进程与fork()、wait()、exec函数组
  • Centos_linux系统的区别及实际查看
  • 给Extjs的window弹窗的关闭事件添加验证
  • mysql导入存储过程
  • 系统键盘按钮keyCode大全
  • while(*i++=*t++)都做了些什么。
  • 用call和ret实现子程序
  • 求二叉树高度
  • spring整合javaweb(第二版)
  • 转:依赖注入那些事儿
  • 只操作git(cmd)就可以使用git将项目上传到github
  • 转载:javaweb学习总结(二十二)——基于Servlet+JSP+JavaBean开发模式的用户登录注册...
  • 【前端】自适应布局方法总结
  • UML类图详解_关联关系_多对多
  • Docker容器管理
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • JavaScript函数式编程(一)
  • leetcode98. Validate Binary Search Tree
  • spring boot下thymeleaf全局静态变量配置
  • Spring声明式事务管理之一:五大属性分析
  • Vue2.0 实现互斥
  • kubernetes资源对象--ingress
  • ​卜东波研究员:高观点下的少儿计算思维
  • #经典论文 异质山坡的物理模型 2 有效导水率
  • (4)STL算法之比较
  • (C语言)字符分类函数
  • (HAL库版)freeRTOS移植STMF103
  • (多级缓存)多级缓存
  • (附源码)ssm跨平台教学系统 毕业设计 280843
  • (九)One-Wire总线-DS18B20
  • (十一)c52学习之旅-动态数码管
  • (已解决)什么是vue导航守卫
  • (转)http协议
  • (转)Linux下编译安装log4cxx
  • (转)Oracle存储过程编写经验和优化措施
  • (转)VC++中ondraw在什么时候调用的
  • (转)菜鸟学数据库(三)——存储过程
  • (转载)在C#用WM_COPYDATA消息来实现两个进程之间传递数据
  • ***php进行支付宝开发中return_url和notify_url的区别分析
  • ./mysql.server: 没有那个文件或目录_Linux下安装MySQL出现“ls: /var/lib/mysql/*.pid: 没有那个文件或目录”...
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选
  • .NET Framework与.NET Framework SDK有什么不同?
  • .NET 中创建支持集合初始化器的类型
  • .NET 中选择合适的文件打开模式(CreateNew, Create, Open, OpenOrCreate, Truncate, Append)
  • .net 桌面开发 运行一阵子就自动关闭_聊城旋转门家用价格大约是多少,全自动旋转门,期待合作...
  • .NET8.0 AOT 经验分享 FreeSql/FreeRedis/FreeScheduler 均已通过测试
  • .netcore 如何获取系统中所有session_ASP.NET Core如何解决分布式Session一致性问题
  • .NET构架之我见
  • .vollhavhelp-V-XXXXXXXX勒索病毒的最新威胁:如何恢复您的数据?
  • /proc/interrupts 和 /proc/stat 查看中断的情况
  • @staticmethod和@classmethod的作用与区别
  • [ NOI 2001 ] 食物链
  • [ 渗透工具篇 ] 一篇文章让你掌握神奇的shuize -- 信息收集自动化工具
  • []error LNK2001: unresolved external symbol _m