Object-C 棧的應用實現兩個大數相加

  • 對於兩個非常大的數,如1233333333333333333333333333+9090909090909090909090090909909090909090909090是無法直接相加的。因爲已經超過了整型變量的限制可以使用下面代碼獲得基本類型在運行平臺的存儲範圍:
NSLog(@"72----------byte:%ld  max :%ld min:%ld",sizeof(NSInteger),NSIntegerMax,NSIntegerMin);
  • 爲了解決這個問題,可以將這種非常大的數據看成一串字符串,將這個字符串分別存入兩個棧中,然後從棧中彈出數,進行加法操作。

  • 基本思想:

  • 讀入第一個數的數字num1,並將這些數字存到一個棧中(假設爲Stack1);
  • 讀入第二個數的數字num2,並將這些數字存到一個棧中(假設爲Stack2);
  • 定義一個用來保存進位的變量plus = 0;
  • while(至少一個棧不空):
    1.從每一個非空的棧彈出一個數,將這兩個數字與plus相加;
    2.將個位數存入結果棧中(resultStack);
    3.判斷是否發生進位(判斷num1 + num2 > 9),如果發生進位,將進位存入plus中,否則將plus 恢復爲0;
  • 如果進位不爲0,將其存入結果棧中;
  • 從結果棧彈出結果返回即可;
  • 下圖給出應用這種算法的一個示例。示例數爲592與3748
    image.png

image.png

  • 核心代碼如下:
#import "AddLargeNumber.h"
#import "Stack.h"

@interface AddLargeNumber()
@property(nonatomic,strong) Stack* operatorStack1;
@property(nonatomic,strong) Stack* operatorStack2;
@property(nonatomic,strong) Stack* resultStack;

@end

@implementation AddLargeNumber


-(NSString*) addLargeNumber:(NSString*) number1 number2:(NSString*) number2{
    NSMutableString* result = [[NSMutableString alloc] init];
    if (!self.operatorStack1) {
        self.operatorStack1 = [[Stack alloc] initWithSize:[number1 length]];
    }
    if (!self.operatorStack2) {
        self.operatorStack2 = [[Stack alloc] initWithSize:[number2 length]];
    }
    
    if (!self.resultStack) {
        self.resultStack = [[Stack alloc] initWithSize:[number1 length] + [number2 length]];
    }
    
    for(int i = 0;i < [number1 length]; i++){
        NSString *ch = [number1 substringWithRange:NSMakeRange(i,1)];
        [self.operatorStack1 push:ch];
    }
    
    for(int i = 0;i < [number2 length]; i++){
        NSString *ch = [number2 substringWithRange:NSMakeRange(i,1)];
        [self.operatorStack2 push:ch];
    }
    [self.operatorStack1 test];
    [self.operatorStack2 test];
    NSInteger carry = 0;
    while(![self.operatorStack1 isEmpty] || ![self.operatorStack2 isEmpty]){
        NSInteger opt1 = 0;
        NSInteger opt2 = 0;
        if(![self.operatorStack1 isEmpty]){
            opt1 = [(NSString*)[self.operatorStack1 pop] intValue] ;
        }
        if(![self.operatorStack2 isEmpty]){
            opt2 = [(NSString*)[self.operatorStack2 pop] intValue] ;
        }
        NSInteger tmpResult = opt1 + opt2 + carry;
        if (tmpResult > 9) {  //發生進位
            carry = 1;
            NSInteger geWei = tmpResult - 10;
            [self.resultStack push:[NSString stringWithFormat:@"%ld",geWei]];
        }else{
            carry = 0;
            [self.resultStack push:[NSString stringWithFormat:@"%ld",tmpResult]];
        }
        [self.resultStack test];
    }

    while (![self.resultStack isEmpty]) {
        NSString* tmp = (NSString*)[self.resultStack pop];
        [result appendString:tmp];
    }
    return [result copy];
    
}

@end

  • 運行結果:
    image.png

書籍參考 《數據結構C++版》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章