首先说清楚2个概念:
概念1.一个M位数 与一个N位数 相乘,乘积的位数一定小于等于(N+M).
如.2数99 乘以 4位数 9999, 其结果为 989901 ,为2+4 = 6位数.
上面的概念很重要,因为我们要创建一个初始值都为0, 元素个数为(M+N) 的数组,
例如:99x918,我们需要创建2+3的元素的resultArray[0,0,0,0,0]
概念2. 如果初始值resultArray[0,0,0,0,0],没有装满结果,那么有且只有最后一个元素为0
所以我们最后去除数组末尾的0,只需要判断最后一个元素是是否为0即可,
例如 99 x 1 --> resultArray[0,0,0] -- resultArray[9,9,0]
99 x 10 --> resultArray[0,0,0,0] -- resultArray[0,9,9,0]
99 x 11 --> resultArray[0,0,0,0] -- resultArray[9,8,0,1]
通过以上例子可知,要么数组的最后一个元素没有0,要么有且只有一个0
大数相乘代码如下:
- (void)bigNumMultiplication2:(NSMutableArray *)arrayA ArrayB:(NSMutableArray *)arrayB
{
int aCount = (int)arrayA.count;
int bCount = (int)arrayB.count;
int resultIndex = 0;
NSMutableArray * resultArray = [[NSMutableArray alloc]init];
//步骤1:创建一个元素个数为(aCount+bCount)的结果数组
for (int i = 0; i < aCount+ bCount; i ++)
{
[resultArray addObject:@"0"];
}
//步骤2:将数组倒置,(不倒置也行,下面的for循环代码改一下就行)
arrayA = (NSMutableArray *)[[arrayA reverseObjectEnumerator]allObjects];
arrayB = (NSMutableArray *)[[arrayB reverseObjectEnumerator]allObjects];
//步骤3:将各个数乘好,并放入resultArray
for (int i = 0; i < aCount; i ++)
{
//取出数组A的值
int valueA = [arrayA[i] intValue];
for (int j = 0; j < bCount; j ++)
{
//取出数组B的值
int valueB = [arrayB[j] intValue];
//定义resultArray 的Index
resultIndex = i + j;
int tempResult = (valueA * valueB) + [resultArray[resultIndex]intValue];
//OC就是麻烦,还得转为String存入数组,swift可以直接存
resultArray[resultIndex] = [NSString stringWithFormat:@"%d",tempResult];
}
}
NSLog(@"resultArray==11=%@",resultArray);
//步骤4:计算进位
//默认初始进位为0
int carry = 0;
for (int i = 0; i < resultArray.count; i ++)
{
carry = carry + [resultArray[i] intValue];
//计算各个位置的数-->除以10取余数
int finalValue = carry % 10;
//将最终的数放入数组
resultArray[i] = [NSString stringWithFormat:@"%d",finalValue];
//计算进位,除以10取整
carry = carry / 10;
}
NSLog(@"resultArray==222=%@",resultArray);
//步骤5.最后去除数组末尾的0,这里有2个概念先了解:
/*
概念1.一个M位数 与一个N位数 相乘,乘积的位数一定小于等于(N+M).
如.2数99 乘以 4位数 9999, 其结果为 989901 ,为2+4 = 6位数.
上面的概念很重要,因为我们要创建一个初始值都为0, 元素个数为(M+N) 的数组,
例如:99x918,我们需要创建2+3的元素的resultArray[0,0,0,0,0]
概念2. 如果初始值resultArray[0,0,0,0,0],没有装满结果,那么有且只有最后一个元素为0
所以我们最后去除数组末尾的0,只需要判断最后一个元素是是否为0即可,
例如 99 x 1 --> resultArray[0,0,0] -- resultArray[9,9,0]
99 x 10 --> resultArray[0,0,0,0] -- resultArray[0,9,9,0]
99 x 11 --> resultArray[0,0,0,0] -- resultArray[9,8,0,1]
通过以上例子可知,要么数组的最后一个元素没有0,要么有且只有一个0
*/
if (resultArray.count > 1 && [resultArray.lastObject intValue] == 0)
{
//去除做后一个0
[resultArray removeLastObject];
}
//最后将数组倒置即可得到结果
resultArray = (NSMutableArray *)[[resultArray reverseObjectEnumerator]allObjects];
NSLog(@"resultArray===%@",resultArray);
}
//调用
- (void)viewDidLoad
{
[super viewDidLoad];
NSString * stringA = @"123";
NSString * stringB = @"456";
[self bigNumMultiplication2:[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;
}