iOS 大数相乘

server/2024/10/17 22:14:18/

首先说清楚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;
}


http://www.ppmy.cn/server/132594.html

相关文章

网站集群批量管理-Ansible-进阶

1. 流程控制 1.1 handlers触发器 应用场景: 1. 一般用于分发配置文件的时候 2. 如果配置文件发生变化则重启服务,如果没有变化则重启 3. 注意事项: handlers放在剧本的最后,否则都会被识别为handlers 没有使用触发器handlers - hosts: alltasks:- name: 分发文件copy:src: /e…

[含文档+PPT+源码等]精品基于Python实现的flask专家管理系统[包运行成功+永久免费答疑辅导]

基于Python实现的Flask专家管理系统的背景&#xff0c;可以从以下几个方面进行详细阐述&#xff1a; 一、专家资源管理的重要性 在现代社会中&#xff0c;各领域专家资源对于推动科技进步、解决复杂问题以及提升决策质量等方面具有不可替代的作用。然而&#xff0c;传统的专家…

Edge论文的创新点

创新点及其来源 1. 从灰度边缘重建RGB图像的方法&#xff08;EdgRec&#xff09; 基于的方法&#xff1a;传统的重建方法&#xff0c;如使用自动编码器或生成模型来重建正常样本的图像&#xff0c;并通过对原始图像和重建图像的比较来检测异常。 重建过程&#xff1a; 训练阶…

大数据面试题整理——Zookeeper

系列文章目录 大数据面试题专栏点击进入 文章目录 系列文章目录大数据面试题专栏点击进入 1. 什么是 Zookeeper&#xff1f;2. Zookeeper 的特点有哪些&#xff1f;3. Zookeeper 的数据模型是怎样的&#xff1f;4. Zookeeper 的工作流程是怎样的&#xff1f;5. Zookeeper 如何…

ROS理论与实践学习笔记——6 ROS机器人导航(仿真)之导航实现

准备工作&#xff1a;请先安装相关的ROS功能包 安装 gmapping 包(用于构建地图):sudo apt install ros-<ROS版本>-gmapping 安装地图服务包(用于保存与读取地图):sudo apt install ros-<ROS版本>-map-server 安装 navigation 包(用于定位以及路径规划):sudo apt in…

第十四章 RabbitMQ延迟消息之延迟队列

目录 一、引言 二、死信队列 三、核心代码实现 四、运行效果 五、总结 一、引言 什么是延迟消息&#xff1f; 发送者发送消息时指定一个时间&#xff0c;消费者不会立刻收到消息&#xff0c;而是在指定时间后收到消息。 什么是延迟任务&#xff1f; 设置在一定时间之后才…

大数据-174 Elasticsearch Query DSL - 全文检索 full-text query 匹配、短语、多字段 详细操作

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

JIT详解

文章目录 JIT为什么说 Java 语言“编译与解释并存”&#xff1f; JIT原理JVM 架构简览JIT 编译流程JIT 编译器的实现优化策略方法内联逃逸分析 JIT 在Java中&#xff0c;JIT&#xff08;Just-In-Time&#xff09;编译器是Java虚拟机&#xff08;JVM&#xff09;的一个重要组成…