Objective-C实现埃拉托色尼筛法(附完整源码)
发布日期:2025-04-25 16:40:43 浏览次数:5 分类:精选文章

本文共 1604 字,大约阅读时间需要 5 分钟。

埃拉托色尼筛法(Sieve of Eratosthenes)是一种高效地找出一定范围内所有素数的算法。在本文中,我们将详细介绍如何使用Objective-C实现这一经典算法。

埃拉托色尼筛法的实现

埃拉托色尼筛法的基本思想是通过逐步筛选来移除非素数,从而找出所有在给定范围内的素数。具体步骤如下:

  • 创建布尔数组:首先,我们需要创建一个布尔数组isPrime,用于标记每个数是否为素数。数组的长度为给定的上限limit,初始时所有元素都设置为YES,表示最初假定所有数都是素数。

  • 处理边界条件:由于2是最小的素数,因此我们首先将其标记为素数,并将其后续的偶数全部标记为非素数,以减少计算量。

  • 筛选过程:从最小的素数开始(即从2开始),逐个筛选。对于每一个素数p,我们从p*p开始,到limit结束,步长为p。对于每个位置i,如果isPrime[i]仍为YES,则将其标记为NO,因为它不是素数。

  • 返回结果:最终,数组中所有标记为YES的位置即为所求的素数。

  • 以下是完整的Objective-C实现代码:

    #import 
    NSMutableArray* sieveOfEratosthenes(NSInteger limit) {
    NSMutableArray* isPrime = [[NSMutableArray alloc] init];
    // 初始化数组,所有元素初始为YES
    for (NSInteger i = 0; i <= limit; i++) {
    [isPrime addObject:[NSNumber numberWithBool:YES]];
    }
    // 处理边界条件:2是最小的素数
    if (limit >= 2) {
    [isPrime replaceObjectAtIndex:1 withObject:[NSNumber numberWithBool:NO]];
    // 将所有2的倍数标记为非素数
    for (NSInteger i = 4; i <= limit; i += 2) {
    [isPrime replaceObjectAtIndex:i withObject:[NSNumber numberWithBool:NO]];
    }
    }
    // 从最小的素数开始筛选
    for (NSInteger p = 2; p * p <= limit; p++) {
    if ([[isPrime objectAtIndex:p] boolValue]) {
    // 标记p的倍数为非素数
    for (NSInteger i = p * p; i <= limit; i += p) {
    [isPrime replaceObjectAtIndex:i withObject:[NSNumber numberWithBool:NO]];
    }
    }
    }
    return isPrime;
    }

    代码解释

    • 初始化数组:创建一个初始为YES的布尔数组isPrime,表示所有数最初都被认为是素数。
    • 处理偶数:由于2是最小的素数,直接标记2和所有偶数为非素数。
    • 筛选过程:从最小的素数开始,逐个筛选,标记其倍数为非素数。
    • 返回结果:最终返回标记数组isPrime,其中YES表示对应的数是素数。

    通过这种方法,我们可以高效地找出给定范围内的所有素数。这种方法的时间复杂度为O(n log log n),在处理较大范围时表现尤为出色。

    上一篇:Objective-C实现域名解析(附完整源码)
    下一篇:Objective-C实现埃拉托斯特尼筛法算法(附完整源码)

    发表评论

    最新留言

    第一次来,支持一个
    [***.219.124.196]2025年03月31日 17时29分18秒

    关于作者

        喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
    -- 愿君每日到此一游!

    推荐文章