分解质因数
一、质数定义
- 在大于1的整数中,如果只包含1和本身这两个约数,就被称为质数,或者叫素数
二、例题
(1)试题
- 算法提高 分解质因数
(2)问题描述
- 给定一个正整数n,尝试对其分解质因数
(3)输入格式
- 仅一行,一个正整数,表示待分解的质因数
(4)输出格式
- 仅一行,从小到大依次输出其质因数,相邻的数用空格隔开
(5)样例输入
100
(6)样例输出
2 2 5 5
三、分解质因数方法:试除法
(1)时间复杂度较高的暴力算法
时间复杂度是O(n)
①代码
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
prime_formula_base(n);
}
public static void prime_formula_base(int n) {
for (int i = 2; i <= n; i++) {
while (n % i == 0){
System.out.print(i + " ");
n = n/i;
}
}
}
}
②评测结果
(2)时间复杂度较低的优化算法
时间复杂度是O(√n)
被除数的两个约数总是对应存在的
- 例如:
12的约数有3和4
12/3 = 4
12/4 = 3 - 假设:
d是n的一个约数
则n/d也是n的一个约束
d<=n/d
d的平方<=n
d<=√n
因此我们所枚举的约数只需要到n/d就好了,大大降低了时间复杂度,降到了O(√n)
①代码
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
prime_formula_pro(n);
}
public static void prime_formula_pro(int n) {
//先通过循环找到所有小于根号x的质数因子
for (int i = 2; i <= n/i; i++) {
while (n % i == 0){
System.out.print(i + " ");
n = n/i;
}
}
//如果说x被所有小于根号x的质数因子除完后,还大于1,说明剩下的一定是那个大于根号x的质因子,直接输出即可 (例如11,43这样的数)
//证明:一个数x中最多包含一个大于根号x的质数因子,很好证明,如果有两个大于根号x的质数因子那么这俩相乘就大于x了,反证法成立
if (n > 1){
System.out.print(n);
}
}
}
②评测结果
四、相关例题
(1)算法提高 质因数
①问题描述
- 将一个正整数N(1<N<32768)分解质因数。例如,输入90,打印出90=233*5
②样例输入
66
③样例输出
66=2311
④代码
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
System.out.print(n + "=");
prime_formula_pro(n);
}
public static void prime_formula_pro(int n) {
for (int i = 2; i <= n/i; i++) {
while (n % i == 0){
n = n / i;
if (n != 1){
System.out.print(i + "*");
}else if(n == 1){
System.out.print(i);
}
}
}
if (n > 1) {
System.out.println(n);
}
}
}
⑤测评结果
(2)算法训练 分解质因数
①问题描述
- 求出区间[a,b]中所有整数的质因数分解。
②输入格式
- 输入两个整数a,b。
③输出格式
- 每行输出一个数的分解,形如k=a1a2a3…(a1<=a2<=a3…,k也是从小到大的)(具体可看样例)
④样例输入
3 10
⑤样例输出
3=3
4=22
5=5
6=23
7=7
8=222
9=33
10=25
⑥代码
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int b = sc.nextInt();
for (int i = a; i <= b; i++) {
System.out.print(i + "=");
prime_formula_pro(i);
System.out.println();
}
}
public static void prime_formula_pro(int n) {
for (int i = 2; i <= n/i; i++) {
while (n%i==0){
n = n/i;
if (n == 1){
System.out.print(i + " ");
}else {
System.out.print(i + "*");
}
}
}
if (n > 1){
System.out.print(n);
}
}
}
⑦测评结果
(3)算法训练 试题3971
①问题描述
- 有一些正整数,如果这个正整数分解质因数之后,只包含2或3或5,那么该数即为“丑数”,比如100就是“丑数”,100分解质因数之后只包含2和5;14就不是“丑数”,因为14分解质因数之后,包含了7.
- 输入正整数n,请写程序判断n是否是“丑数”,是“丑数”则输出“yes”,否则输出“no”。
②输入格式
- 一个正整数n
③输出格式
- 一个字符串yes 或no
④样例输入1
15
⑤样例输出1
242
⑥样例输入2
15
⑦样例输出2
no
⑧代码
import java.util.ArrayList;
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
judge(n);
}
public static void judge(int n) {
if (n < 2){
System.out.println("no");
}else {
ArrayList<Integer> a = new ArrayList<>();
for (int i = 2; i <= n/i; i++) {
while (n%i==0){
a.add(i);
n = n/i;
}
}
if (n > 1){
a.add(n);
}
int count = 0;
for (int i = 0; i < a.size(); i++) {
if (!((int)a.get(i) != 2 && (int)a.get(i) != 3 && (int)a.get(i) != 5)){
count++;
}
}
if (count == a.size()){
System.out.println("yes");
}else {
System.out.println("no");
}
}
}
}
⑨测评结果
(4)算法训练 最大质因数
①问题描述
- 给出N个数字,求出有最大的最大质因数的那个数
②输入格式
- 第一行:一个整数N。
- 接下来的N行,每行一个整数A_i,表示给出的那N个数字。
③输出格式
- 第一行:一个整数,拥有最大的最大质因数的那个数。
④样例输入
4
36
38
40
42
⑤样例输出
38
⑥代码
import java.util.ArrayList;
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] a = new int[n];
int[] max = new int[n];
for (int i = 0; i < n; i++) {
a[i] = sc.nextInt();
max[i] = judge(a[i]);
}
int count = 0;
int temp = 0;
for (int i = 0; i < n; i++) {
if (max[i] > temp){
temp = max[i];
count = i;
}
}
System.out.println(a[count]);
}
public static int judge(int n) {
ArrayList<Integer> a = new ArrayList<>();
for (int i = 2; i <= n/i; i++) {
while (n%i==0){
a.add(i);
n = n/i;
}
}
if (n > 1){
a.add(n);
}
int max = 0;
for (int i = 0; i < a.size(); i++) {
max = Math.max(max,a.get(i));
}
return max;
}
}
⑦测评结果
(5)算法提高 质因数2
①问题描述
- 将一个正整数N(1<N<32768)分解质因数,把质因数按从小到大的顺序输出。最后输出质因数的个数
②输入格式
- 一行,一个正整数
③输出格式
- 两行,第一行为用空格分开的质因数
- 第二行为质因数的个数
④样例输入
90
⑤样例输出
2 3 3 5
4
⑥代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
prime_formula_pro(n);
}
public static void prime_formula_pro(int n) {
//先通过循环找到所有小于根号x的质数因子
int count = 0;
for (int i = 2; i <= n / i; i++) {
while (n % i == 0) {
System.out.print(i + " ");
n = n / i;
count++;
}
}
if (n > 1){
System.out.print(n);
count++;
}
System.out.println();
System.out.println(count);
}
}