解决大数相加的方法有很多,网上很容易搜到,下面介绍两种,一种是在网上抄的,一种是自己想的,我将他们都用函数式的方式重写了一遍。

这种是在网上抄的,的确非常简洁

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

函数式重写,重点在尾递归,这是在函数式编程中代替while的写法。

let compose = (f, g) => (...args) => f(g(...args));
let addUnit = a => b => b + a;
let myPop = a => a.pop();  // 有副作用
let myNumber = a => ~~a;
let remainderTen = x => x % 10;
let isGreeterNine = x => x > 9;
let replaceHeadZero = x => x.replace(/^0+/, "");
let pAndN = compose(myNumber, myPop);
let loop = (a, b, res, c) => {    //尾递归,即在函数末尾自调用if (!a.length && !b.length && !c) return res;let getC = compose(addUnit(pAndN(b)), addUnit(pAndN(a)));let getEes = compose(addUnit(res), remainderTen);return loop(a, b, getEes(getC(c)), isGreeterNine(getC(c)));
}
let add = (a, b) => compose(replaceHeadZero, loop)(a.split(""), b.split(""), "", 0);

自己想的

使用累加器实现

function add(a, b) {a = a.split('').reverse();b = b.split('').reverse();function addMap(aArrayIns, bArrayIns) {return aArrayIns.reduce((accumulator, currentValue, index) => {let c = ~~bArrayIns[index] + ~~currentValue + ~~accumulator[index];if (c >= 10) {accumulator[index] = (c - 10).toString();accumulator.push('1');} else {accumulator[index] = c.toString();}return accumulator;}, []).reverse().join('');}return a.length >= b.length ? addMap(a, b) : addMap(b, a);
}

函数式重写

let compose = (f, g) => x => f(g(x));
let myReverse = x => {let [...y] = x;return y.reverse();
};
let mySplit = x => x.split("");
let myToString = x => x.toString();
let myPushOne = x => {let [...y] = x;y.push("1");return y;
}
let setValue = index => value => targetArray => {let [...y] = targetArray;y[index] = value;return y;
}
let splitAndReverse = compose(myReverse, mySplit);
let myReduce = x => y => y.reduce(fnHandleAdd(splitAndReverse(x)), []);
let fnHandleAdd = a => (accumulator, currentValue, index) => {let c = ~~a[index] + ~~currentValue + ~~accumulator[index];return c >= 10? compose(myPushOne, setValue(index)(myToString(c - 10)))(accumulator): setValue(index)(myToString(c))(accumulator);
};let addMap = (a, b) => compose(compose(R.join(""), myReverse), compose(myReduce(b), splitAndReverse))(a);
let add = (a, b) => a.length >= b.length ? addMap(a, b) : addMap(b, a);

下面这种写法,很不优雅

let addMap = (a, b) => compose(compose(R.join(""), myReverse), compose(myReduce(b), splitAndReverse))(a);

最好compose可以实现组合任意个函数,效果如下

let addMap = (a, b) => compose(R.join(""), myReverse, myReduce(b), splitAndReverse)(a);

实现思路在:https://github.com/zhuanyongx...

我在github https://github.com/zhuanyongx...

两个函数式解决大数相加的方法相关推荐

  1. 链表问题10——两个单链表生成相加链表(方法二)

    题目 假设链表中每一个节点的值都在0-9之间,链表整体代表一个整数. 给定两个这种链表的头节点,请生成代表两个整数相加值的结果链表. 链表1 链表2 生成的新链表 9->3->7 6-&g ...

  2. c语言 大数相加,c/c++开发分享C语言计算大数相加的方法

    c/c++开发分享 问题描述 输入两个整数a和b,输出这两个整数的和.a和b都不超过100位. 算法描述 由于a和b都比较大,所以不能直接使用语言中的标准 输入格式 输入包括两行,第一行为一个非负整数 ...

  3. python进行两个大数相加

    python进行两个大数相加:由于int类型32位或64位都有长度限制,超出会内存溢出,无法计算,那么解决方法如下: 思路: 1.将超长数转换成字符串 2.进行长度补零,即让两个要计算的字符串长度一样 ...

  4. javascript乘法和加法_JavaScript大数相加相乘的实现方法实例

    前言 JavaScript 中的最大安全整数是 2 ^{53} – 1 ,即 9007199254740991,当我们进行超出这个范围的数值计算的时候就无法得到精确的值,而是一个近似值,比如我们计算 ...

  5. 你会用Java实现两个大数相加吗

    两个大数相加(Java)* 1.是整数:* 2.两个数无限大,long都装不下:* 3.不能用BigInteger:* 4.不能用任何包装类提供的运算方法:* 5.两个数都是以字符串的方式提供. * ...

  6. 基于visual Studio2013解决C语言竞赛题之1077大数相加

        题目 解决代码及点评 /************************************************************************/ /* ...

  7. jQuery使用blur()方法触发两次的解决方法

    jQuery使用blur()方法触发两次的解决方法 参考文章: (1)jQuery使用blur()方法触发两次的解决方法 (2)https://www.cnblogs.com/wgl1995/p/92 ...

  8. java 加法 溢出_java实现两个大数相加,可能出现溢出错误

    java实现两个大数相加,可能存在溢出,如123456789 + 987654321 返回 1111111110 用BigInteger 三行就完事啊. 不用这个类也可以实现 public BigIn ...

  9. Java黑皮书课后题第8章:*8.5(代数:两个矩阵相加)编写两个矩阵相加的方法,编写一个测试程序,提示用户输入两个3*3的矩阵,然后显示它们的和

    *8.5(代数:两个矩阵相加)编写两个矩阵相加的方法,编写一个测试程序,提示用户输入两个3*3的矩阵,然后显示它们的和 题目 题目描述与运行示例 破题 代码 题目 题目描述与运行示例 8.5(代数:两 ...

最新文章

  1. android 按钮链接,如何连接到Android中的Power按钮?
  2. rabitMQ优缺点
  3. 联想android刷机教程视频,联想s939刷机教程(刷官方系统)
  4. 通过url 下载文件
  5. 把字符串分隔成多行的多种方法实践
  6. ubuntu vnc 远程连接桌面
  7. Redis 常用配置参数
  8. Deeper Network将于明日启动DPR/USDC流动性质押第三季
  9. signature=29f9d891eda46899a29591e507a569b3,NEW MARKER OF BREAST TUMORS FROM THE LUMINAL-B SYBTYPE
  10. Android通知渠道
  11. Web的缓存加速(Squid的安装与配置)
  12. 刷题记录--1bit与2bit字符
  13. 痞子衡嵌入式:ARM Cortex-M内核那些事(5)- 一表搜罗指令集
  14. производство в смоленске кирпича
  15. 服务器系统fluent,用云服务器算fluent
  16. 电影里的黑客为何都不用鼠标
  17. springBoot(6)---文件上传
  18. 【冰城论道】网心科技李浩:打造沉浸式虚拟现实新体验
  19. QTday2,窗口化界面的制作
  20. vc2010c语言使用教程,【精选】Lesson 01 C语言基础及VC2010使用指导(02.24).pdf

热门文章

  1. 人工智能技术映射出来的16个行业66个应用场景!
  2. 神经元产生的雌激素可能是一种新型的神经调节剂
  3. 1亿参数4万样本BERT仍听不懂人话,我们离通用NLP能还有多远?
  4. 学习计算机视觉你需要知道这关键的八点
  5. 【机器学习】机器学习Top10算法,教你选择最合适的那一个!一文读懂ML中的解析解与数值解...
  6. AI 在携程智能客服的应用
  7. 柳进军 | 城市大脑的逻辑模型
  8. 超人类AI的幻想与思考:自下而上构建的自我迭代意识系统
  9. AI智能体学会动物进化法则:李飞飞等提出深度进化RL
  10. 他们提出了一个大胆的猜想:GWT(深度学习)→通用人工智能