Bootstrap

iOS 大数相加

大数相加的技术点在于进位(两数相加大于10之后进位)

思路如下:

1.从右往左便利,依次去除两个数M和N的个位数、十位数、百位数~~~相加

2.如果M遍历完了,N还没完,那么M用0作为位数上的加数:

代码如下:

- (void)bigNumAdd:(NSMutableArray *)arrayA ArrayB:(NSMutableArray *)arrayB
{
    NSString * resString = @"";
    //倒叙循环
    int i = (int)arrayA.count - 1;
    int j = (int)arrayB.count - 1;
    
    //进位.两个数相加,大于10会进一位, 它的值只能是1或0
    int carry = 0;
    
    while (i >= 0 || j >= 0)
    {
        //往右遍历,依次先取出个位数、十位数、百位数……
        
        /*
         三目运算法,如果i大于等于0,说明arrayA里还有值没遍历,如果arrayA里没有值了就直接赋0
         arrayA = [1,2,3],arrayB = [4,5,6,7], 遍历到第4遍,i=-1,j = 0,所以此时num1=0
         */
        int num1 = i >= 0 ? [arrayA[i] intValue] : 0;
        int num2 = j >= 0 ? [arrayB[j] intValue] : 0;
        
        int sum = num1 + num2 + carry;
        
        if (sum >= 10)
        {
            //两数相加,大于10,需保留个位数,向前进一位
            sum -= 10;
            carry = 1;
        }else{
            carry = 0;
        }
        
        resString = [NSString stringWithFormat:@"%d%@",sum,resString];
        
        NSLog(@"resString=11=%@",resString);
        //本次遍历结束之后,需要对i和j往左移动一位
        i--;
        j--;
    }
    
    //如果在所有的遍历都结束后,carry 还等于1.说明最后一次加法大于10,向前进1,此时我们还需要再拼接一个1
    if (carry == 1)
    {
        resString = [NSString stringWithFormat:@"%d%@",carry,resString];
    }
    
    NSLog(@"最后的结果==%@",resString);
}



//调用
- (void)viewDidLoad 
{
    [super viewDidLoad];
    
    NSString * stringA = @"123456";
    NSString * stringB = @"456789";
    
    [self bigNumAdd:[self stringTransArray:stringA] ArrayB:[self stringTransArray:stringB]];
}

//将字符串转为数组
- (NSMutableArray *)stringTransArray:(NSString *)str
{
    NSMutableArray * array = [[NSMutableArray alloc]init];
    for (int i = 0; i < str.length; i ++)
    {
        unichar ch = [str characterAtIndex:i];
        NSString * charStr = [NSString stringWithFormat:@"%C",ch];
        //添加
        [array addObject:charStr];
    }
    
    return array;
}

;