题解 | #高精度整数加法#

高精度整数加法

http://www.nowcoder.com/practice/49e772ab08994a96980f9618892e55b6

穷举法

将两个数字切割成数组然后反转相加

先获取他们的最长的数组的长度,然后循环这个长度

let line;
let index = 0;
let arr = []


const getNum = (num1,num2)=>{
    let arr1 = num1.split('').reverse()
    let arr2 = num2.split('').reverse()
    let str = ''
    let newArr = [];
    let length = arr1.length > arr2.length ? arr1.length : arr2.length
    for(let i = 0;i<length;i++){
       let carry = 0;
       //分三种情况,要么长度一样,要么arr1长,要么arr2长
        if(arr1[i] && arr2[i]){
        //存在并且相加是否大于10 比如个位相加
            if(Number(arr1[i]) + Number(arr2[i]) >= 10){
                carry = 1
            }
//             大于10的如果arr1长给arr1的十位加一 否则给arr2的十位加1
            if(arr1.length > arr2.length ){
                arr1[i + 1] = (Number(arr1[i + 1]) + carry).toString()
            }else{
                arr2[i + 1] = (Number(arr2[i + 1]) + carry).toString()
            }
            //字符串只添加想家取余的数 比如7+9 取6
            str+= (Number(arr1[i]) + Number(arr2[i])) % 10
            //这个是判断两个数组一样长比如789,456, 
            //7+4已经取了余数1 但是7+4 = 11,所以在第一位补一个1
            if(i == length - 1 && carry){
                str+='1'
            }
            carry = 0
        }else if(arr1[i]){
       //表示arr1长度长。比如7897788,923
       //比如 99999,9999始算 9+9=18 第一步进1 由于千位是9 ,9+1为10,所以这时候千位为10,但是已经大于10了所以取0,将这个1进位给下一个
       //然后遇到9又是10, 当到万位的时候,这个时候是10,已经循环到最后一步了,所以直接取0就好了 前一步的余数就是相加的结果了
            if(Number(arr1[i]) >= 10){
                carry = 1
                arr1[i + 1] = (Number(arr1[i + 1]) + carry).toString()
                str+= ((Number(arr1[i])) % 10).toString();
                //已经取0了但是不要忘记 首位+1
                if(i == length - 1 && carry){
                    str+='1'
                }
            }else{
                str+=  Number(arr1[i]).toString()
            }
            
        }else{
        //同理arr1
            if(Number(arr2[i]) >= 10){
                 carry = 1
                 arr2[i + 1] = (Number(arr2[i + 1]) + carry).toString()
                 str+= ((Number(arr2[i])) % 10).toString();
                 if(i == length - 1 && carry){
                      str+='1'
                  }
            }else{
                str+= Number(arr2[i]).toString()
            }
        }
    }
    return str.split('').reverse().join('')
}
while(line = readline()){
    index++;
    arr.push(line)
    if(index == 2){
         let number = getNum(arr[0],arr[1]);
        console.log(number)
        index=0;
        arr = []
    }
}
全部评论

相关推荐

11-06 12:53
吉林大学 Java
如题,ip属地末九,计算机科班大三本科生。想找一段寒假实习,也是第一次找实习。&nbsp;从大二暑假7月开始准备Java后端,前期有点磨叽,导致现在手忙脚乱。目前第二个项目黑马点评快写完了,第一个项目是苍穹外卖(两个项目都是烂大街的,这就很头大)。算法题在lc上从大二至今陆续刷了将近六百题,hot100已过一遍,面试150目前刷了一半。八股刚看了不到一周,想请教一下各位牛友,这一版简历哪些地方需要继续改进,接着优化?&nbsp;同时,是现在立即开始投递,边投边背八股,完善项目。还是说八股再背个小半个月再开始投递比较好一点,我现在担心的是到了这个月下旬或者12月再开始投递简历面试会有点晚,听同学说到年底hc数量会大...
mikeu04:简历顶部留名字即可,你写“后端开发实习生-Java”就是把自己的方向限制死了。我建议把这揉在个人简介里,说你对后端开发充满热情就行。性别出生年份以及微信号不是必须的。 把个人简介从教育背景里拿出来,第一个写。你的个人简介有点太泛了。把“爱好中长跑”去了,加点数字(“拥有xxx年的xxx经历”),加点你最熟的几个语言或技术栈。和别人的简介区分开来。 专业技能放项目经历前面。面试官一般会优先看这个再往下看你做了什么项目来考察你是否具备这些技能。实习我不是很清楚,但像Redis, JVM, 消息模型,计算机网络这些属于基本知识。你如果了解GCP, AWS, Docker 这些实际生产工具就可以把八股知识换掉。 项目简介可以和工作内容揉在一起。项目简介还是太长了,就一句话,“开发了一个基于【1,2个主要框架】为【目标客户群体】的【产品类型】, 实现了【产品价值】”。产品价值不是功能。比如一个在线计算器,它的功能是算数,但它的价值可以是让人在没带计算器的情况下算数(可访问性)或比手算效率提升了80%。工作内容多加点数字,你这个产品有多少人用了?浏览量是多少?技术上xxx性能提升了多少%?(实在想不出来就丢给deepseek :) 11 月理论上秋招已经结束了。八股是背不完的。无脑投,刷笔试,中了面试邀请就突击面经八股,没问题的。
大厂面试问八股多还是项目...
点赞 评论 收藏
分享
牛客41406533...:回答他在课上学,一辈子待在学校的老教授用三十年前的祖传PPT一字一句的讲解,使用谭浩强红皮书作为教材在devc++里面敲出a+++++a的瞬间爆出114514个编译错误来学这样才显得专业
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务