蓝桥杯 Java B 组之简单数学问题(素数判断、最大公约数)

news/2025/2/21 22:42:26/

Day 4:简单数学问题(素数判断、最大公约数)

数学问题在蓝桥杯中非常重要,尤其是数论基础、数学优化、边界处理等知识。本日的学习目标:

  • 素数判断(Prime Number)
  • 最大公约数(Greatest Common Divisor,简称 GCD)
  • 数学思维转换与优化


 一、素数(Prime Number)

 1. 什么是素数?

**素数(质数)**是指 大于 1,并且只有 1 和 自身 作为因子的整数

通俗定义:大于1的自然数,除了1和它本身外,不能被其他数整除。

例子:2(最小的素数)、3、5、7、11等。

非素数(合数):4(能被2整除)、6(能被2和3整除)。

如何判断素数?

试除法:用2到n-1的数逐个试除,若都除不尽,则为素数。

优化1:只需试除到√n(平方根)。

为什么? 如果n能被a整除,那么n = a×b,a和b至少有一个≤√n。

优化2:先排除偶数(除了2)。

例如:

2, 3, 5, 7, 11, 13, 17, 19...

反之,合数是指除了 1 和 自身 之外,还可以被其他整数整除的数,例如:

4 = 2 × 2, 6 = 2 × 3, 9 = 3 × 3...


 2. 直接枚举法(O(n))

思路

  • 2 开始,检查 n 是否能被 2 ~ n-1 中的任何数整除。
  • 如果可以被整除,则 n 不是素数
  • 如果没有任何数能整除 n,则 n 是素数。

代码实现

public class PrimeNumber {

    public static boolean isPrime(int n) {

        if (n < 2) return false;  // 1 不是素数

        for (int i = 2; i < n; i++) {  

            if (n % i == 0) return false;  // 有因子,非素数

        }

        return true;

    }

    public static void main(String[] args) {

        System.out.println(isPrime(7));  // true

        System.out.println(isPrime(10)); // false

    }

}

时间复杂度 O(n),如果 n 很大(例如 10^9),会非常慢 ❌


3. 优化:遍历到 sqrt(n)(O(√n))

优化思路

  • 任何合数 n 必然可以写成两个因子的乘积: n=a×b
    • 如果 a > sqrt(n),则 b < sqrt(n)。
    • 也就是说,如果 n 有因子,其中至少有一个 ≤ sqrt(n)
    • 因此,我们只需遍历 2 ~ sqrt(n),若 n 不能被其中任何数整除,则 n 是素数。

代码优化

public class OptimizedPrime {

    public static boolean isPrime(int n) {

        if (n < 2) return false;

        if (n == 2) return true;  // 2 是唯一的偶数素数

        if (n % 2 == 0) return false;  // 偶数直接返回 false

        int sqrt = (int) Math.sqrt(n);

        for (int i = 3; i <= sqrt; i += 2) {  // 只检查奇数

            if (n % i == 0) return false;

        }

        return true;

    }

    public static void main(String[] args) {

        System.out.println(isPrime(97));  // true

        System.out.println(isPrime(100)); // false

    }

}

时间复杂度 O(√n),对于 n=10^9 级别问题,能高效处理 ✅


 4. 练习题:区间内素数

题目描述

输入两个整数 `a, b`,输出 `[a, b]` 范围内所有的素数。

代码

import java.util.Scanner;

public class PrimeRange {

    public static boolean isPrime(int n) {

        if (n < 2) return false;

        for (int i = 2; i * i <= n; i++) {

            if (n % i == 0) return false;

        }

        return true;

    }

    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);

        int a = scanner.nextInt();

        int b = scanner.nextInt();

        for (int i = a; i <= b; i++) {

            if (isPrime(i)) {

                System.out.print(i + " ");

            }

        }

    }

}

时间复杂度 O(n√n)


 二、最大公约数(Greatest Common Divisor, GCD)

 1. 什么是最大公约数?

通俗定义:两个数都能被整除的最大正整数。

例子:12和18的最大公约数是6。

应用场景:分数化简(如12/18 → 2/3)。

1. 直接枚举法(O(n))

思路

  • 枚举 1 ~ min(a, b),找到 a 和 b 的最大公因数。

代码

public class GCD {

    public static int gcd(int a, int b) {

        int result = 1;

        for (int i = 1; i <= Math.min(a, b); i++) {

            if (a % i == 0 && b % i == 0) {

                result = i;

            }

        }

        return result;

    }

    public static void main(String[] args) {

        System.out.println(gcd(18, 24));  // 输出 6

    }

}

时间复杂度 O(n),如果 a 和 b 很大,计算会很慢 ❌


 2. 欧几里得算法(辗转相除法,O(logn))

 欧几里得算法(辗转相除法)

核心思想:用较大数除以较小数,用余数替换较大数,直到余数为0,最后的非零余数就是GCD。

数学原理:gcd(a, b) = gcd(b, a % b)。

例子:gcd(48, 18) → gcd(18, 12) → gcd(12, 6) → gcd(6, 0) → 6。

 数学推导

  • 最大公约数定理: GCD(a,b)=GCD(b,aGCD(a, b) = GCD(b, a % b)
  • 终止条件: GCD(a,0)=aGCD(a, 0) = a

代码(递归实现)

public class EuclideanGCD {

    public static int gcd(int a, int b) {

        return (b == 0) ? a : gcd(b, a % b);

    }

    public static void main(String[] args) {

        System.out.println(gcd(18, 24));  // 输出 6

    }

}

代码(迭代实现,防止递归栈溢出)

public class IterativeGCD {

    public static int gcd(int a, int b) {

        while (b != 0) {

            int temp = a % b;

            a = b;

            b = temp;

        }

        return a;

    }

    public static void main(String[] args) {

        System.out.println(gcd(18, 24));  // 输出 6

    }

}

时间复杂度 O(log n),适用于大数计算 ✅


 三、蓝桥杯数学题常考点

考点

典型题目

优化技巧

素数判断

判断素数

遍历到 sqrt(n),跳过偶数

素数筛选

找 1~N 内的素数

埃拉托色尼筛法 O(n log log n)

最大公约数

求 GCD

欧几里得算法 O(log n)

最小公倍数

求 LCM

LCM(a, b) = (a * b) / GCD(a, b)


 四、蓝桥杯中的常考点和易错点

常考点:
素数判断:试除法和优化到平方根的判断方法。
最大公约数:辗转相除法(欧几里得算法)。
数学模型转换:将实际问题转化为数学模型,通过数学公式或算法求解。
易错点:
边界条件:容易忽略边界条件,如1不是素数。
循环逻辑:在试除法中,循环范围容易写错,应为2到sqrt(num)。
效率问题:在求最大公约数时,容易忘记辗转相除法的优化,导致代码效率低下。
5. 术语解释
素数(Prime Number):只能被1和自身整除的大于1的自然数。
最大公约数(GCD, Greatest Common Divisor):两个或多个整数共有约数中最大的一个。
辗转相除法(Euclidean Algorithm):通过不断求余数来计算最大公约数的方法。
总结
素数判断:通过试除法和优化到平方根的方法,可以高效判断一个数是否为素数。
最大公约数:使用辗转相除法(欧几里得算法)可以快速求解两个数的最大公约数。
数学思维转换:将实际问题转化为数学模型,通过数学公式或算法求解。
蓝桥杯常考点:素数判断、最大公约数、数学模型转换。
易错点:边界条件、循环逻辑、效率问题。

http://www.ppmy.cn/news/1572881.html

相关文章

从入门到跑路(六)k8s配置ingress-nginx

Ingress-NGINX 是一个基于 NGINX 的 Kubernetes Ingress 控制器&#xff0c;旨在将外部 HTTP 和 HTTPS 流量路由到 Kubernetes 集群中的服务。它是 Kubernetes 官方推荐的 Ingress 控制器之一&#xff0c;并且广泛应用于各种生产环境中。 Ingress-NGINX介绍 主要作用 在 Kub…

在c#中虚方法和抽象类的区别

在C#中&#xff0c;虚方法&#xff08;virtual method&#xff09;和抽象方法&#xff08;abstract method&#xff09;是面向对象编程中两种重要的机制&#xff0c;用于实现多态性。虽然它们都有助于实现类之间的灵活关系&#xff0c;但它们在定义、使用以及功能上有一些关键的…

SQL递归技巧

1.读样例 with recursive cet_dpt(id, parent_id, path, org_category, level,depart_name) as (select id ,parent_id,depart_name as path,org_category,1 as level,sd.depart_namefrom isolarerp.sys_depart sdwhere del_flag 0and sd.org_code A09B15union al…

python-leetcode-零钱兑换

322. 零钱兑换 - 力扣&#xff08;LeetCode&#xff09; class Solution:def coinChange(self, coins: List[int], amount: int) -> int:# 初始化 dp 数组&#xff0c;大小为 amount 1&#xff0c;初始值为无穷大dp [float(inf)] * (amount 1)dp[0] 0 # 凑成金额 0 所需…

细胞计数专题 | LUNA-FX7™新自动对焦算法提高极低细胞浓度下的细胞计数准确性

现代细胞计数仪采用自动化方法&#xff0c;在特定浓度范围内进行细胞计数。其上限受限于在高浓度条件下准确区分细胞边界的能力&#xff0c;而相机视野等因素则决定了下限。在图像中仅包含少量可识别细胞或特征的情况下&#xff0c;自动对焦可能会失效&#xff0c;从而影响细胞…

爬虫实战:利用代理ip爬取推特网站数据

引言 亮数据-网络IP代理及全网数据一站式服务商屡获殊荣的代理网络、强大的数据挖掘工具和现成可用的数据集。亮数据&#xff1a;网络数据平台领航者https://www.bright.cn/?promoRESIYEAR50/?utm_sourcebrand&utm_campaignbrnd-mkt_cn_csdn_yingjie202502 在跨境电商、社…

基于腾讯云ES混合搜索与TI-ONE部署DeepSeek,快速构建RAG应用

点击蓝字⬆ 关注我们 本文共计2083字 预计阅读时长7分钟 什么是RAG&#xff1f; 随着数据智能技术的不断发展&#xff0c;以大语言模型&#xff08;LLM&#xff09;驱动的AIGC为代表的内容生成技术已经成为企业数据智能能力中不可或缺的一部分。但在实践过程中&#xff0c;LLM&…

qt QTextEdit用法总结

1. 基本介绍 QTextEdit 是 Qt 中用于显示和编辑富文本&#xff08;支持 HTML 子集&#xff09;和纯文本的控件。 支持文本格式&#xff08;字体、颜色、对齐&#xff09;、列表、表格、图片插入等富文本功能。 底层通过 QTextDocument 管理内容&#xff0c;提供强大的文本处理…