0

也许这是一个愚蠢的问题,但现在我学习了 Objective C 并且我试图扩展我的知识,从错误中学习。

因此,我尝试将 Erastosthenes 筛调整为一个函数。我知道当一个函数收到一个结果时,它决定了函数停止。

我很好奇这是否是一种调整返回 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;
}
4

3 回答 3

0

根据我的评论,函数声明应如下所示:

NSArray* erathos(int n);

请注意, NSArray 是不可变的,这意味着一旦创建它就无法更改它。如果要添加值,则需要它的可变子类 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]);
}
于 2013-07-03T09:54:16.163 回答
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;
}
于 2013-07-03T19:06:11.667 回答
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;
}
于 2013-07-03T09:43:49.963 回答