将一个输入的正整数n分解质因数

题目三: 将一个输入的正整数n分解质因数

1.核心代码

1.1 普通正整数(非质数)分解质因数

 for (int i = 2; i <=n; i++) {
      flag01=true;         
      for (int j =2; j <=i/2+1; j++) {
          if(i==2){
      //如果是2.直接跳出去,不用进行素数判断(从2开始的)
             break;
           }
           if(i%j==0){
              flag01=false;
              break;
            }
        }
        if(flag01){
           //当与质数相同时,代币着其本身就是素数
             if(i==n){
                System.out.println("该数"+n+"本身就是质数");
                System.out.println(n+"="+n);
                return;
                //不必执行后面的分解操作
              }else{
                    if(temp%i==0){
                        numbers[r++]=i;
                        temp=temp/i;
                        if(temp==1){
                            flag02=true;
                            break;
                         }
                         //每分解出一个质数因子,那原来的值也要更着分解出来
                     }
                     if(temp%i==0){
                         i--;
                     }
                //还是同一个可以整除的质数,所以寻找质数的范围不用往后移动一个
                  }
              }
 }

1.2 普通正整数(非质数)分解后输出

if(flag02){
    System.out.print(n+"=");
    for (int k = 0; k <r; k++) {
       //以是否为最后一个质因数为条件,分两种输出个数输出
       //不是时,后面要加*,若是,则后面无需加上
       if(k==r-1){
            System.out.print(numbers[k]);
       }else{
            System.out.print(numbers[k]+"*");
       }
      }
      //flag02是保证该数分解完所有的质因子后才执行输出操作
}

2.常见问题点分析

2.1 质数的判定依据是什么???

质数的判定条件为: 大于1的自然数;除了1和自身外没有其他的除数(两者缺一不可)

2.2 质数和素数的关系???

解答: 质数就是素数,就是两种不同的叫法而已。例如普通话和地方方言在讲述相同一件事物上叫法有差异,但是本质上说的还是同一件事物。

2.3 分解质因数的思路是什么?

前提:本文提到的正整数指的是非负整数

解答如下:

正整数为0或者为1时,输出该正整数无满足条件的质因数

正整数为质数时,丛2开始一起往后找质数

直到找到对应的质数,然后就输出"该质数=质数"的结果

正整数为普通数字时,建立一个临时变量temp存放正整数的值

a.每次从2开始往后找质数i,找到一个质数后,与temp相余,

b,若余数为0则该数i为质因数,拿数组a[r++]来存放(顺序)质因数,

c.此时temp的值应为分解出该质因数后的值即temp=temp/i;

c.然后temp与质因数相余,当值为0,那么i–(确保该质数下次还能用)

重复执行a、b、c、d操作,直至temp=1时,意味着分解完毕(跳出当前循环)

然后执行后面的打印操作

2.4 布尔类型变量flag、flag01、flag02的作用分别是什么?

解答如下:

​ flag的作用:确保输入的正整数是符合条件的

​ flag01的作用:确保质数是正确的

​ flag02的作用:确保正整数的所有质因数分解完毕后,执行打印操作

2.5 普通正整数分解质因数时,外层循环为啥为i<=n,内层循环为啥为j<=i/2+1,内层循环时2为啥直接跳出

解答如下:

​ 外层:确保质数寻找的范围足够大,不漏质数

​ 内层: 确保得到的质数是符合质数定义条件的

​ 2跳出原因:这个判断方法只适用于大于2的情况

​ 而2显然是质数,所以直接跳出循环就可.

3 运行截图

3.1 当输入的正整数n=0时

在这里插入图片描述

3.2 当输入的正整数n=1时

在这里插入图片描述

3.3 第一次输入有误且第二次输入正确(第一张图片为质数,第二张图片为普通数字)

在这里插入图片描述

在这里插入图片描述

3.4 第一次输入正确

在这里插入图片描述
在这里插入图片描述

4.源代码

import java.util.Scanner;

public class Factorization {
    public static void main(String[] args) {
        System.out.println("将一个输入的正整数n分解质因数。例如:输入 90,打印出 90=2*3*3*5。");
        System.out.println("注意说明:本题目的正整数定义是非负整数");
        Scanner scanner=new Scanner(System.in);
        System.out.println("请输入正整数n的值");
        int n=scanner.nextInt();
        boolean flag=true;
        //定义一个布尔类型变量flag,确保输入的正整数是符合条件的

        //定义一个数组numbers来存放每次分解得到的质数
        while (true){
            if(n>=0){
                int[] numbers=new int[n/2];
                int r=0;
                //定义变量r来记录分解的质数的先后顺序
                flag=true;
                boolean flag01=true;
                //定义一个布尔类型flag01的数据---判定是否是质数(素数)
                boolean flag02=false;
                //定义一个布尔类型flag02的数据---判断质数是否分解成功
                if(n==0||n==1){
                    System.out.println("该正整数"+n+"没有质因数");
                    return;
                }
                int temp=n;
                for (int i = 2; i <=n; i++) {
                    flag01=true;
                    //先得到素数
                    for (int j =2; j <=i/2+1; j++) {
                        if(i==2){
                            //如果是2.直接跳出去,不用进行素数判断(从2开始的)
                            break;
                        }
                         if(i%j==0){
                             flag01=false;
                             break;
                         }
                    }
                    if(flag01){
                        //当与质数相同时,代币着其本身就是素数
                        if(i==n){
                            System.out.println("该数"+n+"本身就是质数");
                            System.out.println(n+"="+n);
                            return;
                            //不必执行后面的分解操作
                        }else{
                            if(temp%i==0){
                                numbers[r++]=i;
                                temp=temp/i;
                                if(temp==1){
                                    flag02=true;
                                    break;
                                }
                                //每分解出一个质数因子,那原来的值也要更着分解出来
                            }
                            if(temp%i==0){
                                i--;
                            }
                            //还是同一个可以整除的质数,所以寻找质数的范围不用往后移动一个
                        }
                    }
                }
                if(flag02){
                    System.out.print(n+"=");
                    for (int k = 0; k <r; k++) {
                        if(k==r-1){
                            System.out.print(numbers[k]);
                        }else{
                            System.out.print(numbers[k]+"*");
                        }
                    }
                }
            }else {
                flag=false;
                System.out.println("输入的正整数有误,请检查后重新输入");
                System.out.println("请再次输入正整数n的值");
                n=scanner.nextInt();
            }
            if(flag){
                break;
                //输入无误,就会正常跳出循环
            }
        }
    }
}

  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SSS4362

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值