iOS 大数相乘

首先说清楚2个概念:

概念1.一个M位数 与一个N位数 相乘,乘积的位数一定小于等于(N+M).

如.2数99 乘以 4位数 9999, 其结果为 989901 ,为2+4 = 6位数.

上面的概念很重要,因为我们要创建一个初始值都为0, 元素个数为(M+N) 的数组,

例如:99x918,我们需要创建2+3的元素的resultArray0,0,0,0,0

概念2. 如果初始值resultArray0,0,0,0,0,没有装满结果,那么有且只有最后一个元素为0

所以我们最后去除数组末尾的0,只需要判断最后一个元素是是否为0即可,

例如 99 x 1 --> resultArray0,0,0 -- resultArray9,9,0

99 x 10 --> resultArray0,0,0,0 -- resultArray0,9,9,0

99 x 11 --> resultArray0,0,0,0 -- resultArray9,8,0,1

通过以上例子可知,要么数组的最后一个元素没有0,要么有且只有一个0

大数相乘代码如下:

objectivec 复制代码
- (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;
}
相关推荐
Shimeri38 分钟前
越卷越像:我用遗传算法做了个"内卷"实验
算法·three.js·数据可视化·遗传算法·进化算法
Evand J1 小时前
【PMSM例程1】永磁同步电机(PMSM)转速与转子电角度观测算法|基于扩展卡尔曼滤波(EKF)的传感器状态估计与误差。附下载链接
算法·电机·1024程序员节·卡尔曼滤波
guo_wen_qiang1 小时前
二叉树的层序遍历-使用双端队列Deque
算法·leetcode·1024程序员节
爱读书的小胖1 小时前
LeetCode 55 跳跃游戏 C 语言解题分析
c语言·数据结构·算法·leetcode·1024程序员节
CCblandy1 小时前
前缀缓存命中率不靠引擎靠排列:本机仿真 3 轮,易变字段放开头 98.0%→0.0%
人工智能·python·算法·自然语言处理·性能优化
上班摸鱼下班游戏1 小时前
Unity 仿生智能算法 从蚁群算法 开始
算法·unity·游戏引擎
pipixia200332 小时前
C++ 面试高频:namespace 的 6 个知识点,从 using 到匿名命名空间
c语言·学习·算法·嵌入式·命名空间·c++面试·匿名命名空间
Navigator_Z3 小时前
LeetCode //C - 1300. Sum of Mutated Array Closest to Target
c语言·算法·leetcode
SZYSK3 小时前
鸿蒙人脸识别算法放在终端里:和外挂授权 SDK 差在排障路径
物联网·算法·华为·harmonyos
凯瑟琳.奥古斯特3 小时前
力扣1016高效解法:剪枝优化技巧
开发语言·c++·算法·leetcode·职场和发展