下面这个程序 会生成 一个质数表。由于 我们 需要 不断 将 新的质数 添加 到数组物件当中,所以 我们 需要 使用 可修改的数组物件,也就是 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
|
在上面的程序当中
1
|
NSMutableArray
*primes
=
[
[
NSMutableArray
alloc
]
initWithCapacity
:
25
]
;
|
这行语句 采取了 initWithCapacity:这项措施 并且 附带 参数25,创建了 一个初始容量为25的数组物件primes。随着 程序的执行,可修改数组物件的容量 会 根据需要 自动 增加。
接着 我 将 数组物件primes中开头两个元素 分别 设定为 2 和 3,就像 这样:
1
2
3
|
[
primes
addObject
:
[
NSNumber
numberWithInteger
:
2
]
]
;
[
primes
addObject
:
[
NSNumber
numberWithInteger
:
3
]
]
;
|
addObject:这项措施 可以将 一个物件 添加 到数组物件的结尾处。addObject:这项措施的实施对象 是 数组物件,它的参数 是 你希望添加到数组物件中的物件。
接着 程序 进入 一个for()循环。这个for() 开始寻找 从5 到MAXPRIME这个范围内的质数。循环表达式
1
|
p
=
p
+
2
|
表明 在寻找质数的过程中 要跳过 所有的偶数,因为 偶数 不可能 是 质数。对于 每个潜在的质数p,我们 需要检查 它 能不能 被 它之前的所有质数,也就是 变量previousPrime的值,整除。如果 潜在的质数p 不能够 被 它之前的所有质数 整除,那么 它 就是 质数。为了 性能优化,你 只需要 检查 潜在的质数p 是否能被 其平方根前面的所有质数 整除 就可以了。这 是 因为 如果 一个整数 不是 质数,那么 它 必然 能 被 小于或等于它平方根的质数 整数,相反,那 肯定 是 质数。所以 只要 之前的质数previousPrime 小于 或者 等于 当前的潜在质数p,那么 表达式
1
|
previousPrime
<=
p
/
previousPrime
|
就 一定 成立。
如果 变量isPrime的值 最后 还是 YES,那么 do{}while()循环 就会中止,表明 你 已经 找到了 一个新的质数。接着 当前的潜在质数p 就会 被转换成 NSNumber类型的物件,并且 添加 到数组物件primes当中。接着,程序 继续执行。