Java实现-分解质因数(5分)(慕课)

/*
分解质因数(5分)
题目内容:
每个非素数(合数)都可以写成几个素数(也可称为质数)相乘的形式,这几个素数就都叫做这个合数的质因数。比如,6可以被分解为2x3,而24可以被分解为2x2x2x3。
现在,你的程序要读入一个[2,100000]范围内的整数,然后输出它的质因数分解式;当读到的就是素数时,输出它本身。

输入格式:
一个整数,范围在[2,100000]内。

输出格式:
形如:
n=axbxcxd

n=n
所有的符号之间都没有空格,x是小写字母x。

输入样例:
18

输出样例:
18=2x3x3
*/

解题思路:

仔细审题,发现解题要点

  1. 题目要求输出一个式子,所以考虑以字符串的形式输出该式子
  2. 构造一个含有很多素数的数组,目的是便于查找能够被整除素数,如果能够被整除,则添加到字符串中
  3. 需要注意素数因子是从小到大的,所以可以通过改变数组下标的形式重新遍历素数数组,以实现从头开始查找能让n整除的素数
  4. 如果输入的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);
	}

}

如果有问题可以留言交流,我一定及时回复;
如果采纳记得点个赞,我在集赞哈哈哈

扫描二维码关注公众号,回复: 10586645 查看本文章
发布了9 篇原创文章 · 获赞 4 · 访问量 270

猜你喜欢

转载自blog.csdn.net/Hunter_Kevin/article/details/105377592
今日推荐