欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 锐评 > iOS 大数相乘

iOS 大数相乘

2024/10/24 3:24:38 来源:https://blog.csdn.net/wyz670083956/article/details/143026444  浏览:    关键词:iOS 大数相乘

首先说清楚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:将各个数乘好,并放入resultArrayfor (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 的IndexresultIndex = i + j;int tempResult = (valueA * valueB) + [resultArray[resultIndex]intValue];//OC就是麻烦,还得转为String存入数组,swift可以直接存resultArray[resultIndex] = [NSString stringWithFormat:@"%d",tempResult];}}NSLog(@"resultArray==11=%@",resultArray);//步骤4:计算进位//默认初始进位为0int 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;
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com