试图让我的Objective-C程序更高效;初学者

问题描述:

#import <Foundation/Foundation.h> 

int main (int argc, const char * argv[]) 
{ 

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 
    int number, right_digit; 

    NSLog(@"Enter your number."); 
    scanf("%i", &number); 

    while (number != 0) { 
     right_digit = number % 10; 
     if (right_digit <0 && number <10 && number>-10) { 
      right_digit = -right_digit; 
      NSLog(@"%i- ", right_digit); 
     } 
     else if (right_digit<0) { 
      right_digit = -right_digit; 
      NSLog(@"%i", right_digit); 
     } 
     else { 
     NSLog(@"%i", right_digit); 
     } 
     number /=10; 
    } 

    [pool drain]; 
    return 0; 
} 

上述代码的工作原理是找到一个数字的反转,包括正数和负数。如果否定的话,比如说-1234,那么答案应该是4321-。我在那里没有问题。我只是学习Objective-C,所以我明白这是一个基本问题,我的代码是非常基础的。问题是我有一些重复的代码,我相信有更好的方式来写这个。我只是想知道是否有人能给我任何见解。试图让我的Objective-C程序更高效;初学者

+0

看起来像[代码评论](http://codereview.stackexchange.com/)的问题。如果您喜欢,您可以标记您的问题并请主持人将其迁移到那里。请记住,不建议交叉发布。 – 2011-11-05 22:16:46

(我可能会做不同的是,我还没有评估它的正确性/鲁棒性),我不能看到任何被认为是“低效率”的东西。

必须你必须遍历每个数字,而且你看起来并没有超出必要的迭代次数。逻辑是(除了实际输出)“标量”(非对象)整数值,所以没有不必要的对象创建。您最多可以消除if报表中的一个或两个测试,但效率增益不大。而且我看不出如何使用任何Cocoa类可能会简化它。

+0

谢谢。它确实有效。我只是想知道如果没有重复代码来解决问题,可能会有更好的方法。 –

+1

杰夫的方法肯定有点“更紧密”,但有可能(现实生活中)是一次或多次显示一个数字的数字(就像你一样)而不是一次显示(如杰夫所做的那样)。而且,尽管他的代码更小/更紧密,但在大多数情况下效率的差异可以忽略不计。基本上你想避免大的低效率(例如,大的N平方算法或堆的大集合),而不用担心是否可以在2-3行代码中执行简单的操作。 –

我愿意做这样说:没有批评的算法的细节

NSInteger number = -12; 
NSUInteger inverse = 0; 

NSInteger sign = (number >= 0) ? 1 : -1; 

number = number * sign; 

while (number > 0) 
{ 
    inverse = inverse * 10 + (number % 10); 
    number = number/10; 
} 

NSLog(@"%i%@", inverse, (sign == -1) ? @"-" : @"");