大数相加的技术点在于进位(两数相加大于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;
}