
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实现代码:
#importNSMutableArray* 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),在处理较大范围时表现尤为出色。
发表评论
最新留言
第一次来,支持一个
[***.219.124.196]2025年03月31日 17时29分18秒
关于作者

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