题目:将一个正整数分解质因数。例如:输入90,打印出90=233*5。
首先我们要对这个问题进行分析:
如果我们要对n分解质因数。应该先找到一个最小的质数k,而后按照下述步骤进行
1)如果这个质数恰好等于n,则说明分解质因数的过程已经结束,打印出即可;
2)但是如果n不等于k,但是n能被k整除,则应该打印出k的值,并且用n除以k的商,作为新的正整数n。重复执行第一步。
3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。
我们还必须要明白质数的概念,作为质数,0和1不是质数。
根据算术基本定理,每一个比1大的整数,要么本身是一个质数,要么可以写成一系列质数的乘积;而且如果不考虑这些质数在乘积中的顺序,那么写出来的形式是唯一的。最小的质数是2。
话不多说直接上代码:
import java.util.Scanner;
//分解质因数
public class Prime_factor {
//n代表需要输入的正整数
static int n,k = 2;
public static void main(String[] args) {
System.out.print("请输入一个大于2的正整数:");
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
System.out.print(n+"=" );
while(n!=k) {
if(n%k == 0) {
n = n/k;
System.out.print(k+"*");
}
else {
k++;
}
}
System.out.print(n);
}
}
结果如下
老规矩我们再来看一波大神代码:
public static void no4(int num) {
for(int i = 2;i <= num;) {
if(num % i == 0) {
num /= i;
if(i <= num) {
System.out.print(i+"*");
} else {
System.out.print(i);
}
} else {
i++;
}
}
}
当然了大神的代码省略了输入以及开始的一些包含关系等。
我们再来看大神代码的递归版
/**
* 递归 自己调用自己 一定要记得什么时候结束
* @param num
* @param k
*/
public static void no4(int num,int k) {
if(k <= num) {
if(num % k == 0) {
System.out.print(k+"*");
no4(num / k, k);
}else {
no4(num,++k);
}
}
}
这里就是一个简单的递归,作为递归一定要记得有结束条件。而且我在上大二大三的时候我忘了,好像有一个大佬曾经告诉过我尽量避免使用递归。不过不管怎么说一个东西被发明出来肯定有它的价值。所以作为学习还是建议大家了解一下。如果你不懂你就把它写下来,盯着代码看。亦或是往中间加入一条输出语句分析一下执行过程你就明白了。后续我还会发一些调试程序的博客,不过最近比较忙,要学习java还要做毕设。唉,苦呀。
来源:CSDN
作者:cdut2016
链接:https://blog.csdn.net/cdut2016/article/details/103718343