JS大数相加

JavaScript实现大数相加算法 //注意输入的是两个数组,最终逆序输出和 /* 输入 [2,4,3] [5,6,4] 输出 [ 7, 0, 8 ] 342+465=807 逆序 708 */ let transNum = num => { let str= num+""; let res= []; // console.log(typeof str); for(let i=0;i<str.length;i++) res.push(parseInt(str[i])); retu 阅读详情

记得之前看到过一个JS超大正整数相加的题目,今天想了下自己会怎么实现,于是便进行了尝试,代码如下:

function  bigAdd(a, b){
	    let  lenA = a.length,
			 lenB = b.length,
			 curry = 0,
			 res = [];
		let loopLen = Math.max(lenA, lenB );

		for(let i = 0 ; i < loopLen ; i++){
			const indexA = ( lenA - i - 1 ) > -1 ? lenA - i -1 : -1;
			const indexB = ( lenB - i - 1) > -1 ? lenB - i -1 : -1;

			const valA = indexA > -1 ? a[ indexA ] : 0 ;
			const valB = indexB > -1 ? b[ indexB ] : 0 ;

			res[i] = (  Number(valA) + Number(valB)  + curry) % 10;
			curry = Math.floor( ( Number(valA) + Number(valB)  + curry ) / 10 );
		}	
		return res.reverse().join('');
	}

想法很简单,就是按照加法的规律,从末尾开始一项一项的相加。
然后看了网上关于该题目的算法,真是惊叹别人算法的简洁以及对于JS中类型转换相关知识的巧妙应用。

	function addBig(a, b){
		let temp = 0,
			res = '';
		a = a.split('');
		b = b.split('');
		while( a.lenght || b.length || temp){
			temp += ~~a.pop() + ~~b.pop();
			res = (temp % 10 ) + res;
			temp = temp > 9;
		}
		return res.replace(/^0+/g, '');
	}

首先,这个代码给人的感觉真的很精简。但是其中其实隐藏了很多关于JS 中类型转换的相关知识, 下面我们来一一分析。
1.为什么将a,b转换为数组
转换为数组的目的是为了在while循环体中使用 pop方法来获取数组中的最后一项。如果你不转换为数组,我们能想到的获取字符串的最后一项的方法是sutstr(-1,1)。但是这种方法只能获取最后一项,无法动态的改变字符串本身。
2. 为什么while的判断条件是 a.lenght || b.length || temp而不是a || b || temp
因为循环体中每次的循环会使数组长度减少1,当数组为空时,假设极端的条件下 a, b都为[],但是这个时候 [] || [] || 0 的结果是 true, 循环永不结束。只因为Boolean([]) = true。
3. 为什么使用~~a.pop(),如果只是 为了将值转换为数字 ,为何不使用Number进行强制转换不是更加易懂?
这个就十分精髓了,首先使用~操作符进行取反是会将字符串转换为数字的,在进行一个取反操作,就转换为了字符串本身代表的数字,但不仅如此。考虑下我们数组循环的最后为空时,[].pop()的结果为undefined, 而 Number(undefined)的结果为NaN,~NaN的结果为-1, ~~NaN的结果 为0,当你使用NaN进行加法运算时,一切结果都没有了意义。所以这个地方必须为~~a.pop(), 而不能使用Number进行强制转换。
4. 为什么temp = temp > 9,这是什么鬼?
这一点其实也是用了JS中的隐式转换,我们换个写法你就明白了temp = temp > 9 ? 1 : 0,temp实际上表示的是进位的结果,在循环的开始我们使用temp += ~~a.pop() + ~~b.pop();进行temp的再赋值,实际等价于temp = (true | false) + Number。 而Boolean在进行数字运算时,true会转换为1,false会转换为0,此处巧妙的应用了该隐式转换。

一个小小的算法,其中隐含了这么多的基础知识,所以还是需要夯实基础啊!!!

QComboBox设置最大显示数量多余的用滑动条,以及QComboBox::setMaxVisibleItems()不起作用的问题 QComoboBox是Qt封装的一个选择框的东西,但是我在使用过程中有一点感觉很不好,如图: 不论你往里面添加多少个它都会给你显示全部,甚至给你铺满全屏,后来看了官方文档发现有个setMaxVisibleItems()的方法,我欣喜若狂啊,终于特么的能解决了,但是,很遗憾,不知为啥,我设置上之后并没有起作用,依然会显示全部,后来搜了百度发现有个人是这样解决的 QComboBox *box = ne... 阅读详情

相关推荐

银河麒麟服务器操作系统V10SP3 U盘安装中“基础软件仓库错误”的排查与修复指南

本文针对在无网络环境下使用U盘安装银河麒麟服务器操作系统V10SP3时,遇到的“基础软件仓库错误”问题,提供了详细的排查与修复指南。核心解决方案是通过进入救援模式,使用lsblk命令确定U盘实际设备路径,并在系统引导时手动添加inst.repo内核参数来指定安装源,从而绕过安装程序的自动探测故障,确保安装流程顺利进行。

ik67890123的博客 1193

JavaScript小数精确相加,使用decimal.js或者big.js

JavaScript小数精确相加,使用decimal.js或者big.js

weixin_44523517的博客 4321

超越图灵机——论人工智能实现的可能性(一)

超越图灵机——论人工智能实现的可能性(一)我认为人工智能是可以实现到逻辑思维这一步的,因为逻辑思维可以完全用字符串来表示,图灵机可以把任意单元置成任意值,在这一点上是完备的,这就足以描述逻辑思维了,所以用图灵机完全可以实现到逻辑思维。当然图灵机会受到哥德尔不完备性的制约,但是逻辑系统也会受到同样的制约,所以我认为完全可以用图灵机实现逻辑思维。那么逻辑思维的本质机理与图灵机是什么关系?逻辑思

太极语言 1万+

JS处理两个超大的数相加

一道鄙视题: let a = '99999999999999'; let b = '9999'; console.log(bigAdd(a,b)); // 100000000009998 function bigAdd(str1, str2) { let res = ''; let temp = 0; str1 = str1.split('') str2 = str2.split('') while (str1.length

qq_51558433的博客 889

华中科技大学 计算机组成原理 educoder Logisim平台 计算机数据表示实验

本文主要是对 计算机数据表示实验的笔记和相关Logisim平台的图,供大家学习交流使用。 需要源文件或者源代码,可以留言评论! 目录实验目的第1关:汉字国标码转区位码实验第2关:汉字机内码获取实验第3关:偶校验编码设计第4关:偶校验解码电路设计第5关:16位海明编码电路设计第6关:16位海明解码电路设计第7关:海明编码流水传输实验第8关:16位CRC并行编解码电路设计第9关:CRC编码流水传输实验实验结果: 实验目的 本实训将帮助同学们巩固对计算机中数据表示方法的理解,要求能设计汉字国标码与区位码之间的转换

weixin_48383580的博客 2万+

CSIT883系统分析与项目管理——Lecture3重点概念

🎈本节课,介绍了项目集成管理当中,关于NPV这个概念相关的内容,以及介绍什么是系统需求,什么时候需要开始系统需求,如何进行调查系统需求等等相关的题目,这里供大家复习参考吧!还有还有最关键的是NPV的计算,我单独写一篇博文,需要的同学快去学习吧!

AI手套的博客 1090

Big.js基本用法 解决js精度问题

解决js精度问题 小数运算

Kerwin__li的博客 3494

基于Arduino与Velostat的智能鞋垫:DIY足底压力监测系统全解析

压力传感器是物联网和健康监测领域的基础元件,其核心原理是将物理压力转换为可测量的电信号。通过压阻效应,材料的电阻值随压力变化,从而实现压力感知。这项技术为低成本、定制化的健康监测方案提供了可能,尤其在运动分析和康复训练中具有重要价值。本文聚焦于利用Velostat压敏材料和Arduino平台,详细解析如何从传感器制作、信号调理到无线数据传输,构建一套完整的足底压力监测系统。文中深入探讨了传感器阵列构建、信号滤波等关键技术,并针对常见问题提供了实用的解决方案,为创客和开发者实现可穿戴健康监测设备提供了清晰的工

weixin_32818781的博客 401

big.js基本使用 解决js精度丢失问题 以及el-table合计行自定义小计合计示例

精度丢失 big.js el-table合计行自定义小计合计示例

z1183的博客 1074

从零构建爬虫抓取故宫数字文物库:Python最新实战技术详解

熟悉了动态内容加载的网页结构解析技巧。掌握了 Playwright + BeautifulSoup 的组合用法。实现了从网页→JSON→详情→图像的完整数据闭环。掌握了结构化保存与可视化分析能力。

2201_76125261的博客 1307

五步教你用GPT-5画出国自然技术路线图!轻松节省80%画图时间(附AI提示词)

七哥给大家推荐的高校都在用的AI平台——高级学术版专业应用平台,集成了ChatGPT、Claude、Gemini、Grok等Al大模型的PLUS版本平台,包括 ChatGPT-5、4o、o3、4.1、4.5、Gemini 2.5 Pro、Claude 3.7、Claude 4、DeepSeek 满血版、Grok 3 、Grok 4等原生线路,还有国际主流的GPTs学术应用,可以辅助大家高效完成科研和学术写作任务,当然撰写硕博论文,课题、职称论文、国社科、国自然基金本子也是手拿把掐。

智能AI让学术科研更容易 1497

js实现动态的数字相加之和

function arr() { var s = 0; for (var i = 0; i < arguments.length; i++) { s = s + arguments[i]; } return s; } var res = arr(1,2,3,3,4,5); document.write(res); 在小程序中查看效果 ...

web全栈开发的博客 2392

基于Spring Boot 3 + Vue 3 + UniApp的全栈高校社团管理小程序设计与实现

requestMatchers("/api/auth/**", "/doc.html", "/webjars/**", "/v3/api-docs/**").permitAll() // 公开接口。<u-search placeholder="搜索活动" v-model="searchKeyword" @search="loadActivities" :showAction="false"></u-search>R.success("活动创建成功") : R.error("活动创建失败");

2201_76125393的博客 368

js 数字相加_JavaScript大数相加相乘实现

‍‍‍‍来源 | https://www.clloz.com/programming/front-end/js/2020/10/18/javascript-bignumber-add-multiply/前言JavaScript中的最大安全整数是2 ^{53} – 1253–1,即 9007199254740991,当我们进行超出这个范围的数值计算的时候就无法得到精确的值,而是一个近似...

weixin_39805180的博客 382

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

JS 大数相加

大家先看一个例子: 出现这样是为什么呢? 因为JavaScript 里的数字是采用IEEE 754 标准的 64 位双精度浮点数,该规范定义了浮点数的格式,对于64位的浮点数在内存中的表示,最高的1位是符号位,接着的11位是指数,剩下的52位为有效数字,具体如下: 如图(网上找的,如有冒犯,立马删除): 第0位:符号位, s 表示 ,0表示正数,1表示负数; 第1位到第11位:...

麻瓜哇哇哇的博客 3092

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

【JS】JavaScript 实现大数相加不丢失精度

在 JavaScript 中,处理大数相加可以使用字符串操作来避免数值溢出的问题。这只是一个简单的实现示例,可能无法处理所有的特殊情况,如负数、非数字字符等。在实际应用中,你可能需要根据具体需求对该函数进行进一步的改进和优化。

Eliaukoyx 853

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

js实现大数相加

//js实现大数相加 function add(str1, str2) { if (Number(str1) > Number(str2)) { var len = str1; } else { var len = str2; } ...

qq_38702877的博客 1105

js大数相加

在js中,会遇见俩数相加溢出的问题,今天就聊聊用算法实现大数相加。 function twoSum(a,b){ var n = Math.max(a.length,b.length) //前面补0使得俩数长度一样 a = a.padStart(n,0) b = b.padStart(n,0) var c = 0 // 进位 // 结果 var res = '' for(let i = n-1;i>=0;i--){ t = parseInt(a[i]) +parseInt(b

qq_41801117的博客 2417

js计算数值相加_JavaScript大数相加相乘实现

前言JavaScript 中的最大安全整数是 2 ^{53} – 1253–1,即 9007199254740991,当我们进行超出这个范围的数值计算的时候就无法得到精确的值,而是一个近似值,比如我们计算 9007199254740991 + 10 得到的结果是 9007199254741000。本文讲一下如何利用字符串在 JavaScript 中实现大数相加相乘。相加用字符串实现相加相乘基本思路...

weixin_39550379的博客 343

JS大数相加、大数相乘

JavaScript只有一种数字类型,可以使用也可以不使用小数点来书写数字。在JavaScript中,数字不分为整数类型和浮点数类型,所有的数字都是浮点数类型。JavaScript采用IEEE754标准定义的 64 位浮点格式表示数字,此格式用 64 位存储数值。其中0~51存储数字片段,52~62存储指数,63位存储符号。来看看JavaScript中数字的最大值和最小值// 5e-324注:这里的最大值指的是字面意思上的最大值;最小值则指的是正数情况下小数点后能表示的最小值。

军火库 1832

js 大数相加

1、 function add (str1, str2) { let len1 = str1.length; let len2 = str2.length; // let len = len1&lt;len2 ? len1 : len2; let len = Math.max(len1, len2); let res = ''; let jin ...

u013362969的博客 2464

js浮点数/大数相加

console.log(0.1 + 0.2); //0.30000000000000004 console.log(0.1 + 0.2 === 0.3); //false 原因在于 js的 Number 是IEEE 754标准的64-bits的双精度数值,这是一种二进制表示法,可以精确地表示分数,比如1/2,1/8,1/1024。但是,二进制浮点数表示法并不能精确的表示类似0.1这样 的简...

zl13015214442的博客 4060

大数据相加_JavaScript 大数据相加的问题

同样是一道面试题,来自有道前端的面试。写一个函数处理大数据的相加问题,所谓的大数据是指超出了整型,长整型之类的常规数据类型表示范围的数据。实现语言不限。我是用js实现的,说一下我自己的思路:1、首先这个题目最重要的环节在考虑怎么存储大数据?用什么数据类型保存呢?最简单可行的方式是String2、确定了使用何种类型保存数据之后这个题目就明朗了。首先判断两个传入字符串的长度,取最短的len循环,两者从...

weixin_39795065的博客 262

javaScript两个大数相加

在JavaScript中,两个大数不能直接相加的原因是因为JavaScript的Number类型遵循IEEE 754标准,它有一个最大安全整数的限制,即Number.MAX_SAFE_INTEGER,超过这个范围就会出现精度丢失。

RuofeiX的博客 547

JS算法:大数相加

题目 给定两个字符串形式的非负整数 num1和num2 ,计算它们的和。 输入描述: 两个字符串形式的非负整数 输出描述: 对于每组测试数据,输出字符串,不包含前导零和多余空格。 输入例子:13254 4354325 输出例子:4367579 解题思路 JavaScript表达的最大整数是:pow(2, 53) = 9007199254740992。 大于2的53次方以后,多出来的有效数字(最后三位的111)都会无法保存,会变成0。 所以不能使用常规的加法进行计算,而且题目中输入也是两个字符串

小绵杨 1914

JS实现大数相加

在JavaScript中,进行大数相加时,由于JavaScript的Number类型有一定的精度限制,直接相加可能会导致精度损失。

关注最新技术问题并持续维护更新 1022
上一篇: git--ssh key无效
下一篇: JS实现lazyMan
izwell
博客等级 码龄14年 16粉丝 88原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值