本文共 1807 字,大约阅读时间需要 6 分钟。
埃拉托色尼筛法(Sieve of Eratosthenes)是计算机科学中常用的算法之一,用于找出一定范围内的所有素数。作为一名Objective-C开发者,如果你需要实现这一算法来生成小于或等于给定整数的所有素数,那么以下是一个完整的代码实现。
以下是一个基于Objective-C的埃拉托色尼筛法实现代码示例。这个算法通过创建一个布尔数组来表示每个数字是否为素数,并逐步筛选出所有不为素数的数字。
#import@interface SieveOfEratosthenes : NSObject- (void)printPrimesUpTo:(NSInteger)n;@end@implementation SieveOfEratosthenes- (void)printPrimesUpTo:(NSInteger)n { if (n < 2) { return; } // 创建一个布尔数组来表示每个数是否为素数 NSMutableArray *isPrime = [[NSMutableArray alloc] init]; for (NSInteger i = 2; i <= n; i++) { [isPrime addObject:@(i)]; } // 初始化计数器 NSInteger count = 0; // 从最小的质数开始筛选 for (NSInteger i = 2; i <= n; i++) { if ([isPrime[i] boolValue]) { count++; // 使所有i的倍数变为非素数 for (NSInteger j = i * i; j <= n; j += i) { [isPrime[j] setObject:@(false) forKey:[NSString stringWithFormat:@"%d", j]]; } } } // 打印所有找到的素数 for (NSInteger i = 2; i <= n; i++) { if ([isPrime[i] boolValue]) { NSLog("%d", i); } }}@end
数组初始化:首先,我们创建一个布尔数组isPrime,其中的每个元素表示对应的数字是否为素数。初始时,所有数字都被认为是素数。
筛选过程:从最小的质数2开始,逐个检查每个数字。如果当前数字是素数(即isPrime[i]为true),那么我们将所有它的倍数标记为非素数。
标记倍数:对于每个质数i,从i*i开始,步长为i,标记所有i的倍数为非素数。
输出结果:最后,遍历isPrime数组,打印所有标记为素数的数字。
@interface部分:声明了一个Objective-C类SieveOfEratosthenes,并定义了一个方法printPrimesUpTo:(NSInteger)n,用于生成不大于n的所有素数。
@implementation部分:实现了上述声明的方法。在这个方法中:
NSMutableArray来存储每个数字是否为素数的信息。n初始化每个数字为素数。count用于统计素数的数量。isPrime数组,打印所有为真值的数字,即为素数。当调用printPrimesUpTo: 100时,程序会输出所有小于等于100的素数,包括2、3、5、7、11、...、97。
埃拉托色尼筛法通过创建和维护一个布尔数组来高效地找出素数,这种方法的时间复杂度为O(n log log n),在处理较大的数字时表现非常出色。这个Objective-C实现可以帮助你快速生成所有小于等于给定整数的素数列表。
转载地址:http://dwifk.baihongyu.com/