下面这个程序 会生成 一个质数表。由于 我们 需要 不断 将 新的质数 添加 到数组物件当中,所以 我们 需要 使用 可修改的数组物件,也就是 NSMutableArray这类物件。虽然 质数 都 是 整数,但是 我们 无法 将 int类型的数值 直接 存储 到数组物件中。由于 数组物件 只能
存储 物件,所以 我们 必须 将 int类型的质数 先 转换成 NSNumber类型的物件,然后 才能 存储 在数组物件当中。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 | #import <Foundation/NSObject.h> #import <Foundation/NSArray.h> #import <Foundation/NSString.h> #import <Foundation/NSAutoreleasePool.h> #define MAXPRIME 100 int main (int argc, const char * argv[]) { int i,p,previousPrime; BOOL isPrime; NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init]; //创建存储质数表的数组物件 NSMutableArray *primes=[[NSMutableArray alloc] initWithCapacity:25]; //将前两个质数2和3存储到数组物件primes当中 [primes addObject:[NSNumber numberWithInteger:2]]; [primes addObject:[NSNumber numberWithInteger:3]]; //计算剩余的质数 for(p=5;p<=MAXPRIME;p=p+2) //检查变量p当前的值是否为质数 { isPrime=YES; i=1; do { previousPrime=[[primes objectAtIndex:i] intValue]; if(p%previousPrime==0) { isPrime=NO; } i=i+1; } while (isPrime==YES && previousPrime<=p/previousPrime); if(isPrime==YES) { [primes addObject:[NSNumber numberWithInt:p]]; } } //显示质数表 for(i=0;i<[primes count];i=i+1) { NSLog(@"%i",[[primes objectAtIndex:i] intValue]); } [pool drain]; return 0; } |
运行 上面的程序后,可以得到 这样的结果:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
2012-04-13 11:08:51.405 Sample[3183:707] 2
2012-04-13 11:08:51.407 Sample[3183:707] 3
2012-04-13 11:08:51.407 Sample[3183:707] 5
2012-04-13 11:08:51.408 Sample[3183:707] 7
2012-04-13 11:08:51.408 Sample[3183:707] 11
2012-04-13 11:08:51.409 Sample[3183:707] 13
2012-04-13 11:08:51.409 Sample[3183:707] 17
2012-04-13 11:08:51.409 Sample[3183:707] 19
2012-04-13 11:08:51.410 Sample[3183:707] 23
2012-04-13 11:08:51.410 Sample[3183:707] 29
2012-04-13 11:08:51.411 Sample[3183:707] 31
2012-04-13 11:08:51.411 Sample[3183:707] 37
2012-04-13 11:08:51.412 Sample[3183:707] 41
2012-04-13 11:08:51.412 Sample[3183:707] 43
2012-04-13 11:08:51.412 Sample[3183:707] 47
2012-04-13 11:08:51.413 Sample[3183:707] 53
2012-04-13 11:08:51.413 Sample[3183:707] 59
2012-04-13 11:08:51.414 Sample[3183:707] 61
2012-04-13 11:08:51.414 Sample[3183:707] 67
2012-04-13 11:08:51.415 Sample[3183:707] 71
2012-04-13 11:08:51.415 Sample[3183:707] 73
2012-04-13 11:08:51.416 Sample[3183:707] 79
2012-04-13 11:08:51.416 Sample[3183:707] 83
2012-04-13 11:08:51.417 Sample[3183:707] 89
2012-04-13 11:08:51.421 Sample[3183:707] 97
|
在上面的程序当中
| NSMutableArray *primes=[[NSMutableArray alloc] initWithCapacity:25]; |
这行语句 采取了 initWithCapacity:这项措施 并且 附带 参数25,创建了 一个初始容量为25的数组物件primes。随着 程序的执行,可修改数组物件的容量 会 根据需要 自动 增加。
接着 我 将 数组物件primes中开头两个元素 分别 设定为 2 和 3,就像 这样:
|
[primesaddObject:[NSNumbernumberWithInteger:2]];
[primesaddObject:[NSNumbernumberWithInteger:3]];
|
addObject:这项措施 可以将 一个物件 添加 到数组物件的结尾处。addObject:这项措施的实施对象 是 数组物件,它的参数 是 你希望添加到数组物件中的物件。
接着 程序 进入 一个for()循环。这个for() 开始寻找 从5 到MAXPRIME这个范围内的质数。循环表达式
表明 在寻找质数的过程中 要跳过 所有的偶数,因为 偶数 不可能 是 质数。对于 每个潜在的质数p,我们 需要检查 它 能不能 被 它之前的所有质数,也就是 变量previousPrime的值,整除。如果 潜在的质数p 不能够 被 它之前的所有质数 整除,那么 它 就是 质数。为了 性能优化,你 只需要 检查 潜在的质数p 是否能被 其平方根前面的所有质数 整除 就可以了。这 是 因为 如果 一个整数 不是 质数,那么 它 必然 能 被 小于或等于它平方根的质数 整数,相反,那 肯定 是 质数。所以 只要 之前的质数previousPrime 小于 或者 等于 当前的潜在质数p,那么 表达式
|
previousPrime<=p/previousPrime
|
就 一定 成立。
如果 变量isPrime的值 最后 还是 YES,那么 do{}while()循环 就会中止,表明 你 已经 找到了 一个新的质数。接着 当前的潜在质数p 就会 被转换成 NSNumber类型的物件,并且 添加 到数组物件primes当中。接着,程序 继续执行。