/*
分解质因数(5分)
题目内容:
每个非素数(合数)都可以写成几个素数(也可称为质数)相乘的形式,这几个素数就都叫做这个合数的质因数。比如,6可以被分解为2x3,而24可以被分解为2x2x2x3。
现在,你的程序要读入一个[2,100000]范围内的整数,然后输出它的质因数分解式;当读到的就是素数时,输出它本身。
输入格式:
一个整数,范围在[2,100000]内。
输出格式:
形如:
n=axbxcxd
或
n=n
所有的符号之间都没有空格,x是小写字母x。
输入样例:
18
输出样例:
18=2x3x3
*/
解题思路:
仔细审题,发现解题要点
- 题目要求输出一个式子,所以考虑以字符串的形式输出该式子
- 构造一个含有很多素数的数组,目的是便于查找能够被整除素数,如果能够被整除,则添加到字符串中
- 需要注意素数因子是从小到大的,所以可以通过改变数组下标的形式重新遍历素数数组,以实现从头开始查找能让n整除的素数
- 如果输入的n是素数,则按照要求直接输出,并结束程序即可
因为慕课的这一章是讲函数(方法)的知识,所以本文会提供两个版本的代码,一个是非函数版,一个是函数版
非函数版(先看这个代码有助于理解本思路的流程):
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner inputScanner = new Scanner(System.in);
int i, j;
int[] primeNumber = new int[200];
int num = 0;
boolean sign;
//构造出一个含有200个素数的数组primeNumber[200]
for (i = 2; num < 200; i++) {
sign = true;
for (j = 2; j <= (int)Math.sqrt(i); j++) {
if (i % j == 0) {
sign = false;
break;
}
}
//判断该数是否是素数,如果是,就保存到数组primeNumber[num]中
if (sign) {
primeNumber[num] = i;
num++;
}
}
//输入数字n,先判断该数是否是素数
int n = inputScanner.nextInt();
sign = true;
for (i = 2; i <= Math.sqrt(n); i++) {
if (n % i == 0) {
sign = false;
break;
}
}
//如果是素数,则输出该数并结束程序
if (sign) {
System.out.print(n + "=" + n);
System.exit(0);
}
/*关键代码,当输入的数不是素数时,如何按照题目要求输出式子*/
String string = "" + n + "="; //初始化strings字符串为“n=”
//遍历素数数组,从小到大,查找能够被n整除的素数,并按要求添加到字符串strings中
for (i = 0; i < 200; i++) {
//如果能被该素数整除,并且商不是1,则添加“素数+x”到字符串中,如果商是1,则仅添加“素数”到字符串中,并且结束遍历循环
if (n % primeNumber[i] == 0) {
n /= primeNumber[i];
if (n != 1) {
string += primeNumber[i] + "x";
}else {
string += primeNumber[i];
break;
}
i = -1; //注意:重新遍历素数数组,使数组下标变为-1,然后到循环时i++,使得下标变为0,实现从头开始找能让n整除的素数
}
}
//输出字符串
System.out.print(string);
}
}
函数版(对关键代码进行了封装):
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner inputScanner = new Scanner(System.in);
//输入数字n,先判断该数是否是素数
int n = inputScanner.nextInt();
boolean flag = true; //作为是否是素数的标记
for (int i = 2; i <= Math.sqrt(n); i++) {
if (n % i == 0) {
flag = false;
break;
}
}
//如果是素数,则输出简单式子并结束程序,否则调用函数输出对应式子
if (flag) {
System.out.print(n + "=" + n);
System.exit(0);
}else {
outPut(n);
}
}
//封装函数,无返回值类型,在函数内输出字符串
private static void outPut(int n) {
int i, j;
int[] primeNumber = new int[200];
int num = 0;
boolean sign; //作为是否是素数的标记
//构造出一个含有200个素数的数组primeNumber[200]
for (i = 2; num < 200; i++) {
sign = true;
for (j = 2; j <= (int)Math.sqrt(i); j++) {
if (i % j == 0) {
sign = false;
break;
}
}
//判断该数是否是素数,如果是,就保存到数组primeNumber[num]中
if (sign) {
primeNumber[num] = i;
num++;
}
}
/*关键代码,当输入的数不是素数时,如何按照题目要求输出式子*/
String string = "" + n + "="; //初始化strings字符串为“n=”
//遍历素数数组,从小到大,查找能够被n整除的素数,并按要求添加到字符串strings中
for (i = 0; i < 200; i++) {
//如果能被该素数整除,并且商不是1,则添加“素数+x”到字符串中,如果商是1,则仅添加“素数”到字符串中,并且结束遍历循环
if (n % primeNumber[i] == 0) {
n /= primeNumber[i];
if (n != 1) {
string += primeNumber[i] + "x";
}else {
string += primeNumber[i];
break;
}
i = -1; //注意:重新遍历素数数组,使数组下标变为-1,然后到循环时i++,使得下标变为0,实现从头开始找能让n整除的素数
}
}
//输出字符串
System.out.print(string);
}
}
如果有问题可以留言交流,我一定及时回复;
如果采纳记得点个赞,我在集赞哈哈哈