从函数内的循环返回数字列表

时间:2013-07-03 09:27:47

标签: objective-c c

也许这是一个愚蠢的问题,但现在我学习了目标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;
}

3 个答案:

答案 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;
}