题目三: 将一个输入的正整数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;
//输入无误,就会正常跳出循环
}
}
}
}