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++版》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值