分解质因数——试除法

一、质数定义

  • 在大于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=2
3
7=7
8=222
9=33
10=2
5

⑥代码
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);
    }
}
⑦测评结果

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

呦呦呦欸哟哟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值