2011-11-05 3 views
0
#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; 
} 

Le code susmentionné fonctionne dans la mesure où il trouve l'inverse d'un nombre, à la fois négatif et positif. Si négatif, disons par exemple, -1234, la réponse est supposée lire 4321-. Je n'ai aucun problème là-bas. J'apprends juste l'Objective-C donc je comprends si c'est une question basique et mon code est très basique. Le problème est que j'ai un code qui se répète et je suis sûr qu'il y a une meilleure façon d'écrire cela. Je voulais juste savoir si quelqu'un pouvait me donner un aperçu.Essayer de rendre mon programme objectif-c plus efficace; Débutant

+0

Cela ressemble à une question pour [Code Review] (http://codereview.stackexchange.com/). Vous pouvez signaler votre question et demander à un modérateur de la migrer si vous le souhaitez. Gardez à l'esprit que la publication croisée n'est pas recommandée. –

Répondre

0

Sans critiquer les détails de l'algorithme (je aurais pu faire différemment, et je ne l'ai pas évalué pour l'exactitude/robustesse) Je ne peux pas voir tout ce qui serait considéré comme "inefficace".

Nécessairement, vous devrez parcourir chaque chiffre, et vous ne semblez pas itérer plus que nécessaire. La logique est toutes les valeurs entières "scalaires" (sauf objet) (sauf pour la sortie réelle), donc pas de création d'objet inutile. Tout au plus, vous pourrez peut-être éliminer un ou deux des tests dans vos instructions if, mais il y a peu de gain d'efficacité. Et je ne vois pas comment utiliser des classes de Cocoa pourrait l'avoir simplifié.

+0

Merci. Ça marche. Je me demandais juste s'il y aurait eu un meilleur moyen sans répéter le code pour faire le problème. –

+1

L'approche de Jef est certainement un peu plus "serrée", mais il peut y avoir des arguments pour ou contre l'affichage du nombre un chiffre à la fois (comme vous le faites) contre tout à la fois (comme Jef). Et, tandis que son code est plus petit/resserré, la différence d'efficacité serait négligeable dans la plupart des cas. Fondamentalement, vous voulez éviter les grandes inefficacités (par exemple, les grands algorithmes N-carrés ou de grandes conglomérations de tas) et ne vous inquiétez pas de savoir si vous pourriez faire une opération simple dans 2-3 lignes de code de moins. –

2

que je le ferais de cette façon:

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) ? @"-" : @""); 
Questions connexes