[算法]大数相减

今天在小米OJ上看到一道题(https://code.mi.com/problem/list/view?id=3), 很有意思, 试着做了一下

描述:

两个长度超出常规整形变量上限的大数相减,请避免使用各语言内置大数处理库,如 Java.math.BigInteger 等。

输入:

有 N 行测试数据,每一行有两个代表整数的字符串 a 和 b,长度超过百位。规定 a>=b,a, b > 0。 测试结果可以用 linux 小工具 bc进行测试是否正确。

输出:

返回表示结果整数的字符串。

输入样例:

1231231237812739878951331231231237812739878951331231231237812739878951331231231237812739878951331231231237812739878951331231231237812739870-89513312312312378127398789513312312312378127398789513312312312378127398789513

1231231237812739878951331231231237812739878951331231231237812739878951331230000000000000000000000001-331231231237812739878951331231231

输出样例:

1231231237812739878951331231231237812739878951331231231237812650365639018918853110413950365639018918853110413950365639018918853110413950357

1231231237812739878951331231231237812739878951331231231237812739878620099998762187260121048668768770

代码:

/**
 * @param  string   line 单行测试数据
 * @return string        返回处理结果
 */
function solution(line) {
    let params = line.split(‘-‘)
    // 被减数数组, 例如: [1, 0, 0, 0, 0]
    let a = params[0].split(‘‘).map(c => parseInt(c))
    // 减数数组
    let b = params[1].split(‘‘).map(c => parseInt(c))
    // 在减数数组前面补0
    let pad = a.length - b.length
    if (pad > 0) {
        for (let i = 0; i < pad; ++i) {
            b.unshift(0)
        }
    }
    // 相减
    for (let i = 0; i < a.length; ++i) {
        let idxA = a.length - 1 - i
        let idxB = b.length - 1 - i
        let intA = a[idxA]
        let intB = b[idxB]
        if (intA >= intB) {
            a[idxA] = intA - intB
        } else {
            a[idxA - 1] = a[idxA - 1] - 1
            a[idxA] = intA + 10 - intB
        }
    }

    let result = a.join(‘‘)
    // 去除结果前面的‘0‘
    result = result.replace(/^0+/, ‘‘)
    return result
}

原文地址:https://www.cnblogs.com/forzhaokang/p/10137030.html

时间: 2024-10-03 19:07:22

[算法]大数相减的相关文章

华为机试—大数相减

题目:大数相减 输入两行字符串正整数,第一行是被减数,第二行是减数,输出第一行减去第二行的结果. 备注:1.两个整数都是正整数,被减数大于减数 示例: 输入:1000000000000001       1 输出:1000000000000000 #include <stdio.h> #include <string.h> #define MAX 100 //100位大数相减 int bigNumSub(char a[],char b[],char sub[]) { int i=0

每日一练:#002大数相减

描述 两个长度超出常规整形变量上限的大数相减,请避免使用各语言内置大数处理库,如 Java.math.BigInteger 等. 输入 有 N 行测试数据,每一行有两个代表整数的字符串 a 和 b,长度超过百位.规定 a>=b,a, b > 0. 测试结果可以用 linux 小工具 bc进行测试是否正确. 输出 返回表示结果整数的字符串. 输入样例 1231231237812739878951331231231237812739878951331231231237812739878951331

HDU 3925 Substring 【大数相减】

题目意思是,给你提供两个数字 a 和 b a 可以不断的往上加, 直到b 为其子串 问的是 a 最小加几? 显而易见,a  的数据范围给了10 ^100非常大,直接模拟肯定不行 那么就用 b 减去 a 来找,也算是一种模拟的方法 举个例子, a = 1299, b = 33 <1>33 330 3300 33000 (12)99 (1)299 1299  1299 ------ -------- --------     ------- 34 31 2001 32001 如果当前 b 比a的部

[算法]大数问题(高精度运算)

[大数相加] [代码一] /********************************* * 日期:2015-01-28 * 作者:SJF0115 * 题目: 大数加法(高精度加法) * 博客: **********************************/ #include <iostream> using namespace std; string AddString(string num1,string num2){ int len1 = num1.length(); in

【算法】大数加减

超长的整型加减法可以用数组int来存储,每个单元可以存储1~9位数字,然后模拟手算过程 大数乘除法,稍复杂,(挖坑)续更.. ====================分割线==================== 1 /************************************************* 2 Copyright: CheerM 3 Author: CheerM 4 Date: 2016-11-02 5 Description: 实现超长int型的加减运算.输入任意长

C语言复习---获取最大公约数(辗转相除法和更相减损法)

源自:百度百科 辗转相除法 辗转相除法:辗转相除法是求两个自然数的最大公约数的一种方法,也叫欧几里德算法. 例如,求(319,377): ∵ 319÷377=0(余319) ∴(319,377)=(377,319): ∵ 377÷319=1(余58) ∴(377,319)=(319,58): ∵ 319÷58=5(余29) ∴ (319,58)=(58,29): ∵ 58÷29=2(余0) ∴ (58,29)= 29: ∴ (319,377)=29. 用辗转相除法求几个数的最大公约数,可以先求出

asp.net(C#)时间相减 得到天数、小时、分钟、秒差

asp.net(C#)时间相减 得到天数.小时.分钟.秒差 DateTime dtone = Convert.ToDateTime("2007-1-1 05:00:00"); DateTime dtwo = Convert.ToDateTime("2007-1-5 08:00:00"); TimeSpan span = dtone.Subtract(dtwo); //算法是dtone 减去 dtwo tss.Text = span.Days + "天&qu

POJ 2756 Autumn is a Genius 使用string的大数加减

本题就是说一个小神童,能计算加减法. 不过题目知识说这个小神童,到底有多神,要我们自己发现. 因为最后给出的数据非常非常巨大,听说接近50k就是超过50000个数位相加,可想而知他多神. 看来题目也是考IQ啊! 如果以为是超级水题,按照一般加减法做,肯定是WA了. 这里给出使用string的加减法运算,因为string是长度可增可减的,所以不管是多少位,只要内存支持,那么本算法都可以支持了.也可以使用vector这些容器.不过string应该更加省点内存. 注意: POJ比较讨厌的就是不支持C+

C#-和时间有关的计算代码、时间相减 得到天数、小时、分钟、秒差

asp.net(C#)时间相减 得到天数.小时.分钟.秒差 asp.net(C#)时间相减 得到天数.小时.分钟.秒差 DateTime dtone = Convert.ToDateTime("2007-1-1 05:00:00");         DateTime dtwo = Convert.ToDateTime("2007-1-5 08:00:00");         TimeSpan span = dtone.Subtract(dtwo); //算法是d