也许这是一个愚蠢的问题,但现在我学习了目标C,我试图扩展我的知识,从错误中学习。
所以我试图让Erastosthenes的Sieve成为一个功能。我知道当一个函数收到一个结果时,它决定了停止的功能。
我很好奇是否是一种方法来调整返回i的代码以发送NSLog中显示的所有数字的列表(@“Prime number%i”,i);以多次执行函数的方式
由于
我的代码
#import <Foundation/Foundation.h>
int erathos (int n)
{
int i, prime, multiple, P[n];
for (i = 2; i <= n; ++i)
{
P[i] = 1;
}
for (prime = 2; prime <= n; ++prime)
{
if (P[prime])
for (multiple = 2 * prime; multiple <= n; multiple += prime)
{
if (P[multiple]) {
P[multiple] = 0;
}
}
}
for (i = 2; i <= n; ++i)
{
if (P[i])
NSLog(@" Prime number %i", i);
}
return i;
}
int main(int argc, const char * argv[])
{
@autoreleasepool {
int erathos (int n);
NSLog(@"Erathos %i", erathos (150));
}
return 0;
}
答案 0 :(得分:0)
NSArray
数据类型是Objective-C中的基本数组类型。 NSMutableArray
表示可变数组类型。数组只能存储对象,而不是int
等基本类型,因此在添加到数组之前,需要将项目转换为NSNumber
个对象。
#import <Foundation/Foundation.h>
NSArray* erathos (int n){
int i, prime, multiple, P[n];
for (i = 2; i <= n; ++i) {
P[i] = 1;
}
for (prime = 2; prime <= n; ++prime) {
if (P[prime]) {
for (multiple = 2 * prime; multiple <= n; multiple += prime) {
if (P[multiple]) {
P[multiple] = 0;
}
}
}
}
NSMutableArray* array = [NSMutableArray array];
for (i = 2; i <= n; ++i) {
if (P[i]) {
[array addObject:[NSNumber numberWithInt:i]];
}
}
return array;
}
int main(int argc, const char * argv[])
{
@autoreleasepool {
// To format any object, use the '@' type specifier.
NSLog(@"Erathos %@", erathos (150));
}
return 0;
}
答案 1 :(得分:0)
根据我的评论,函数声明应如下所示:
NSArray* erathos(int n);
请注意,NSArray是 immutable ,这意味着一旦创建它就无法更改它。如果要添加值,则需要其可变子类NSMutableArray。
使用以下命令创建一个空的NSMutableArray:
NSMutableArray *primesArray = [NSMutableArray array];
要向其添加整数,请使用
[primesArray addObject:[NSNumber numberWithInt:i]];
然后返回它的不可变副本,使用:
return [NSArray arrayWithArray:primesArray];
请注意,您可以只返回NSMutableArray,但然后被调用者可以更改它,这可能是不受欢迎的。
可变数组和不可变副本都是自动释放的,因此在当前自动释放池耗尽时它们将被释放。要掌握它们,你需要像这样保留它们:
[myObject retain];
要打印所有素数,您可以使用foreach结构:
for (NSNumber *n in primesArray) {
NSLog(@"Prime number: %i", [n intValue]);
}
答案 2 :(得分:0)
我调整Krumelur解决方案添加新的NSArray参数。这样就可以使用NSArray索引中的每个对象。
#import <Foundation/Foundation.h>
NSArray* erathos ( NSMutableArray* array, int n){
int i, prime, multiple, P[n];
for (i = 2; i <= n; ++i) {
P[i] = 1;
}
for (prime = 2; prime <= n; ++prime) {
if (P[prime]) {
for (multiple = 2 * prime; multiple <= n; multiple += prime) {
if (P[multiple]) {
P[multiple] = 0;
}
}
}
}
for (i = 2; i <= n; ++i) {
if (P[i]) {
[array addObject:[NSNumber numberWithInt:i]];
}
}
return array;
}
int main(int argc, const char * argv[])
{
@autoreleasepool {
NSMutableArray* myArray = [NSMutableArray array];
NSLog(@"Erathos %@", erathos (myArray,150));
NSLog(@"myArray objectAtIndex 5 is is %@", [myArray objectAtIndex: 5]);
}
return 0;
}