iOS 大数相乘

ops/2024/10/22 5:39:55/

首先说清楚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/ops/127484.html

相关文章

【学习笔记】网络设备(华为交换机)基础知识 9 —— 堆叠配置

提示&#xff1a;学习华为交换机堆叠配置&#xff0c;含堆叠的概念、功能、角色、ID和优先级&#xff1b;堆叠的建立过程以及注意事项&#xff1b;包含堆叠的配置命令&#xff0c;以及堆叠的配置案例 一、前期准备 1.已经可以正常访问交换机的命令行接口 Console口本地访问教…

el-radio 点击报错 Element with focus: inputAncestor with aria-hidden....

一、序言 浏览器版本影响的问题&#xff08;与代码无关&#xff0c;可能是web或浏览器相关协议更新导致&#xff09;&#xff0c;不影响功能的使用. 翻译&#xff1a;元素上的Blocked aria-hidden&#xff0c;因为刚刚接收焦点的元素不能对辅助技术用户隐藏。避免在焦点元素或…

第一章 Linux安装(二)

文章目录 2.Linux 安装2.1 Linux 哲学思想(重点)2.2 Linux 生产主流版本2.3 安装 Linux 系统2.3.1 Linux安装前准备2.3.1.1 VMware WorkStation下载、安装和网络设置2.3.1.2 下载操作系统2.3.1.3 创建一个新的虚拟机 2.3.2 安装Rocky Linux 9操作系统2.3.3 安装Ubuntu 24.04操作…

Java项目-基于springboot框架的体育馆运营系统项目实战(附源码+文档)

作者&#xff1a;计算机学长阿伟 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、ElementUI等&#xff0c;“文末源码”。 开发运行环境 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBoot、Vue、Mybaits Plus、ELementUI工具&#xff1a;IDEA/…

QT QML 练习7-在QML中创建自定义可重用按钮

在本教程中&#xff0c;我们将学习如何在 QML 中创建自定义的可重用按钮。这个例子将引导你创建一个可以在用户界面中多次使用的 MyButton 组件。通过本教程&#xff0c;你将了解如何创建自包含的 QML 组件、处理按钮点击事件以及自定义按钮的外观和行为。 步骤 1&#xff1a;…

Gitlab 完全卸载–亲测可行

1、停止gitlab gitlab-ctl stop2.卸载gitlab&#xff08;注意这里写的是gitlab-ce&#xff09; rpm -e gitlab-ce 3、查看gitlab进程 ps aux | grep gitlab 4、杀掉第一个进程&#xff08;就是带有好多.............的进程&#xff09; 5、删除所有包含gitlab文件 find / …

OpenShift 4 - 云原生备份容灾 - Velero 和 OADP 基础篇

《OpenShift 4.x HOL教程汇总》 说明&#xff1a; 本文主要说明能够云原生备份容灾的开源项目 Velero 及其红帽扩展项目 OADP 的概念和架构篇。操作篇见《OpenShift 4 - 使用 OADP 对容器应用进行备份和恢复&#xff08;附视频&#xff09; 》 Velero 和 OADP 包含的功能和模…