大数相加的技术点在于进位(两数相加大于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或0int carry = 0;while (i >= 0 || j >= 0){//往右遍历,依次先取出个位数、十位数、百位数……/*三目运算法,如果i大于等于0,说明arrayA里还有值没遍历,如果arrayA里没有值了就直接赋0arrayA = [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,此时我们还需要再拼接一个1if (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;
}