分解质因数

BASIC-16 分解质因数

1. 题目

image.png

2. 代码

代码1:

package BasicLQ;
/**
 * @author 张辉
 * 这儿减少了之前无用的工作。
 * 直接循环每一个数
 * 只要可以达到一个结果,那就可以确定就是素数。
 */
import java.util.Scanner;

public class Basic16x {
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		int a = in.nextInt();
		int b = in.nextInt();
		in.close();
		int j,k;
		for (int i = a; i <= b; i++) {
			j = 1;
			k = i;
			System.out.print(k + "=");
			while (k != 1) {
				j++;
				if (k % j == 0) {
					k /= j;
					if (k == 1) {
						System.out.print(j);
					}else {
						System.out.print(j + "*");
					}
					j = 1;
				}
			}
			System.out.println();
		}
	}
}

代码2:

package BasicLQ;

import java.util.Scanner;

/**
 * 分解质因数
 * 质因数分解	循环
 * @author 张辉
 * 这个程序耗费时间太长,在测试案例中只通过了5个,其他几个都是由于时间的问题造成了出错。
 */
public class Basic16 {
	public static int num = -1;
	public static void main(String[] args) {
		long startTime = System.currentTimeMillis();
		Scanner in = new Scanner(System.in);
		int a = in.nextInt();
		int b = in.nextInt();
		in.close();
		mains(primse(b),a,b);
		long endTime = System.currentTimeMillis();
		System.out.println("程序运行时间:" + (endTime - startTime)/1000 + "s");
	}
	public static void mains(int[] array,int a,int b) {
		for (int i = a; i <= b; i++) {
			for (int j = 0; j <= num; j++) {
				StringBuilder str = new StringBuilder();
				str.append(i + "=");
				if (i == array[j]) {
					str.append(i);
					System.out.println(str);
					break;
				}
				int n = i / array[j];
				if (i % array[j] != 0) {
					continue;
				}
				if (in(array, n)) {
					// 再循环一次
					// true;
					str.append(array[j]);
					str.append("*" + n);
					System.out.println(str);
					break;
				}else {
					// false;
					str.append(array[j]);
					fors(array, str, n, j);
					break;
				}
			}
		}
	}
	public static void fors(int[] array,StringBuilder str,int a,int b) {
		/**
		 * array 是传递过来的素数数组
		 * str 是已经准备好的字符串,这个字符串用来存储结果
		 * a 是上一次的n。
		 * b 是上一次循环到的位置
		 */
		 for (int i = b; i <= num; i++) {
			int n = a / array[i];
			if (a % array[i] != 0) {
				continue;
			}
			if (in(array, n)) {
				str.append("*" + array[i]);
				str.append("*" + n);
				System.out.println(str);
				return;
			}else if(n > array[i]) {
				str.append("*" + array[i]);
				fors(array, str, n, i);
				return;
			}
		}
	}
	public static boolean in(int[] array,int n) {
		int flag = 0;
		for (int i = 0; i <= num; i++) {
			if (n == array[i]) {
				flag = 1;
				break;
			}
		}
		if (flag == 0) {
			return false;
		}else if (flag == 1) {
			return true;
		}
		return true;
	}

	public static int[] primse(int n) { // 求n 以内的所有素数,返回为一个数组(数组大小是n的一半)。
		int[] array = new int[(n+1)/2];
		for (int i = 2; i <= n; i++) {
			int flag = 0;
			for (int j = 1; j <= i; j++) {
				if (i % j == 0 && (j == 1 || j == i)) {
					continue;
				}else if(i % j == 0){
					flag = 1;
				}
			}
			if (flag == 0) {
				array[++num] = i;
			}
		}
		return array;
	}
}

3. 理解

首先说以下我对代码2的理解:
这段代码就会出现一个严重的问题,就是遇到大量的数据绝对会超时。
占用的空间:这儿因为要使用迭代,会使用很多的空间,所以回使用大量的空间。
占用的时间:迭代本身就会花费很多时间,再者空间的开辟也会消耗大量的时间。
其次代码1:
这段代码,使用的方法比较巧妙,我还是看了半天都不太明确的。他这儿对素数的理解比较深刻,直接在循环中共判断素数,说来这儿的素数方法更好一些。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值