C语言算法详解:区间素数筛选与位数约束

该编程代码片段定义了一个用于判断素数的Isprime函数,然后在给定的m和n(m<n且n>0)范围内找出所有个位数不为k的素数,按每行五个数输出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

📚 写作目标

  • 目标读者:C语言初学者、算法入门者、备战考试的学生
  • 预期收获:
  1.   掌握素数判断的高效实现
  2. 学会处理数值区间和位数约束
  3. 理解格式化输出的技巧
  • 难度级别:初级 🟢

1. 开篇引入

为什么要学习这个问题?
在实际编程中,我们经常需要处理数值筛选、格式化输出等问题。本题综合了这些要素,是一个非常好的练习题。通过这道题,你将学会:

  • 如何高效判断素数
  • 如何处理数值的位数
  • 如何实现规范的格式化输出

2. 问题详解

2.1 题目描述

给定两个正整数m、n(m < n)和一个个位数k(0 ≤ k ≤ 9),找出区间[m, n]内所有满足以下条件的素数:
        1.  数值在m和n之间(包含边界)
        2.  个位数不等于k
        3.  每行输出5个数,行尾无多余空格

2.2 输入输出规范

输入格式:
m n k(三个整数,用空格分隔)

输出格式:
符合条件的素数,每行5个,用空格分隔

2.3 示例

输入样例:

100 200 7

输出样例:

101 103 109 113 131
139 149 151 163 173
179 181 191 193 199

3. 解题思路

3.1 核心算法分析

  1. 素数判断:使用试除法,只需检查到平方根
  2. 个位数判断:使用取模运算(%10)
  3. 格式化输出:使用计数器控制换行

3.2 优化版完整代码

#include <stdio.h>
#include <math.h>
#include <stdbool.h>

// 优化的素数判断函数
bool isPrime(int num) {
    // 处理特殊情况
    if (num < 2) return false;
    if (num == 2) return true;
    if (num % 2 == 0) return false;
    
    // 只需检查到平方根,且只需检查奇数
    int sqrtNum = (int)sqrt(num);
    for (int i = 3; i <= sqrtNum; i += 2) {
        if (num % i == 0) return false;
    }
    return true;
}

int main() {
    int m, n, k;
    int count = 0;
    
    // 输入处理
    scanf("%d %d %d", &m, &n, &k);
    
    // 确保m不小于2
    m = (m < 2) ? 2 : m;
    
    // 遍历区间
    for (int i = m; i <= n; i++) {
        // 判断是否为符合条件的素数
        if (isPrime(i) && i % 10 != k) {
            // 输出当前数
            printf("%d", i);
            count++;
            
            // 格式控制
            if (count % 5 == 0) {
                printf("\n");  // 满5个数换行
            } else if (i != n) {
                printf(" ");   // 未满5个则空格分隔
            }
        }
    }
    
    // 处理最后一行不足5个数的情况
    if (count % 5 != 0) {
        printf("\n");
    }
    
    return 0;
}

3.3 代码优化要点

1. 素数判断优化:

  •   排除偶数(除2外)
  •   只检查到平方根
  •   只检查奇数因子

2. 输出格式优化:

  •    使用计数器控制换行
  •    避免行尾多余空格
  •    处理最后一行情况

4. 性能分析与优化

4.1 时间复杂度

  • 素数判断:O(√n)
  • 总体复杂度:O(n√n),其中n是区间长度

4.2 可能的进一步优化

1. 埃氏筛法优化:

  •    预处理区间内的所有素数
  •    时间复杂度可降至O(n log log n)

2. 空间优化:

  •    使用位运算存储标记
  •    减少内存使用

5. 常见错误和注意事项

1. ⚠️ 素数判断的边界条件
2. ⚠️ 输出格式控制
3. ⚠️ 最后一行处理
4. ⚠️ 输入范围验证

6. 扩展思考

6.1 进阶问题

1. 如何处理更大范围的输入?
2. 如何优化内存使用?
3. 如何并行化处理?

6.2 实际应用

1. 密码学中的素数生成
2. 数据加密
3. 散列函数设计

7. 练习建议

1. 尝试实现埃氏筛法版本
2. 添加输入验证
3. 优化输出格式控制

8. 互动讨论

👉 你能想到其他优化方法吗?
👉 在实际项目中遇到过类似问题吗?
👉 对代码还有疑问吗?

📝 总结

本文详细讲解了一道综合性算法题,涵盖了:

  • 素数判断的优化
  • 格式化输出的处理
  • 代码的健壮性考虑

希望这篇文章对你有所帮助!如果有任何问题,欢迎在评论区讨论! 🚀


如果觉得有用,请点赞 👍 收藏 ⭐ 分享 ✨

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值