【华为OJ】【044-超长正整数相加】

【华为OJ】【算法总篇章】


【华为OJ】【044-超长正整数相加】

【工程下载】


题目描述

请设计一个算法完成两个超长正整数的加法。

接口说明
/**
 * 请设计一个算法完成两个超长正整数的加法。
 * 输入参数:
 * String addend:加数
 * String augend:被加数
 * 返回值:加法结果
 */
public String addLongInteger(String addend, String augend) {
    /*在这里实现功能*/

    return null;
}

输入描述

输入两个字符串数字

输出描述

输出相加后的结果,string型

输入例子

99999999999999999999999999999999999999999999999999
1

输出例子

100000000000000000000000000000000000000000000000000

算法实现

import java.math.BigInteger;
import java.util.Scanner;

/**
 * Author: 王俊超
 * Date: 2015-12-24 17:18
 * All Rights Reserved !!!
 */
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
//        Scanner scanner = new Scanner(Main.class.getClassLoader().getResourceAsStream("data.txt"));
        while (scanner.hasNext()) {

            String n = scanner.next();
            String m = scanner.next();
            // 【1】方法一
            System.out.println(addLongInteger(n, m));

            // 【2】方法二
//            BigInteger bi1 = new BigInteger(n);
//            BigInteger bi2 = new BigInteger(m);
//            System.out.println(bi1.add(bi2));
        }

        scanner.close();
    }

    /**
     * 大整数相加,ns、ms都不小于0
     *
     * @param ns 数字
     * @param ms 数字
     * @return 结果
     */
    private static String addLongInteger(String ns, String ms) {
        int[] n = getNumber(ns);
        int[] m = getNumber(ms);
        // 进行计算
        int[] r = add(m, n);

        return toNumber(r);
    }

    /**
     * 两个不小于零的整数相加
     *
     * @param m 整数
     * @param n 整数
     * @return 结果
     */
    private static int[] add(int[] m, int[] n) {

//        System.out.println(Arrays.toString(n) +"\n"+ Arrays.toString(m));

        // 保证n不小于m
        if (m.length > n.length) {
            int[] t = m;
            m = n;
            n = t;
        }

        // 结果的最大长度
        int[] r = new int[n.length + 1];
        // 来自低位的进位
        int c = 0;

        for (int i = 0; i < m.length; i++) {
            r[i] = m[i] + n[i] + c;
            c = r[i] / 10;
            r[i] %= 10;
        }

        // 计算余下的部分
        for (int i = m.length; i < n.length; i++) {
            r[i] = n[i] + c;
            c = r[i] / 10;
            r[i] %= 10;
        }

//        System.out.println(Arrays.toString(n) +"\n"+ Arrays.toString(m) + "\n" + Arrays.toString(r));

        // 最后还有进位
        if (c != 0) {
            r[r.length - 1] = c;
            return r;
        }
        // 没有进位
        else {
            int[] ret = new int[r.length - 1];
            System.arraycopy(r, 0, ret, 0, ret.length);
            return ret;
        }
    }

    /**
     * 将整数字符串表示成整数数组【不包含符号位】
     *
     * @param n 整数字符串
     * @return 整数数组 下标从小到大表示数位的从低到高
     */
    private static int[] getNumber(String n) {
        int[] r = new int[n.length()];
        for (int i = 0; i < r.length; i++) {
            r[i] = n.charAt(n.length() - i - 1) - ‘0‘;
        }

        return r;
    }

    /**
     * 将数组表示的整数转换成字符串
     *
     * @param r 整数
     * @return 字符串表示的整数
     */
    private static String toNumber(int[] r) {
        if (r == null) {
            return null;
        }

        StringBuilder b = new StringBuilder(r.length);

        for (int i = r.length - 1; i >= 0; i--) {
            b.append(r[i]);
        }

        return b.toString();
    }
}
时间: 2024-10-25 05:35:27

【华为OJ】【044-超长正整数相加】的相关文章

华为OJ平台——超长正整数相加

题目描述: 请设计一个算法完成两个超长正整数的加法. 输入 输入两个字符串数字 输出 输出相加后的结果,string型 样例输入 99999999999999999999999999999999999999999999999999 1 样例输出 100000000000000000000000000000000000000000000000000 思路: 在Java中,这样的大数运算可以直接用BigInteger类中的方法来进行运算和处理,那样本题没有任何意义了 因此在本方法中,不直接采用该类中

华为机试题:超长正整数相加

描述:  题目描述:请设计一个算法完成两个超长正整数的加法.  要求实现函数: void AddLongInteger(char * pcAddend, char * pcAugend, char * pcAddResult); 输入参数: char * pcAddend:加数 char * pcAugend:被加数 char * pcAddResult:加法结果 返回值:无 运行时间限制: 1 Sec 内存限制: 128 MByte 输入:  两个超长正整数的字符串 输出:  相加后结果的字符

华为測试 超长整数相加

请设计一个算法完毕两个超长正整数的加法. 输入两个字符串数字 输出相加后的结果.string型 例子输入:99999999999999999999999999999999999999999999999999 1 例子输出:100000000000000000000000000000000000000000000000000 #include<iostream> #include<string> using namespace std; string add(string num1,

C/C++ 超长正整数相加

本题整体思想不难,主要是想好用什么容器去存储计算值和计算结果值,这里用的是字符串,当然也可以用数组,题目链接:https://www.nowcoder.com/practice/5821836e0ec140c1aa29510fd05f45fc?tpId 以下为解答代码(具体细节看注释): string AddLongInteger(string addend, string augend){ int i = 0,n=addend.size()>augend.size()?n=addend.siz

华为测试 超长整数相加

请设计一个算法完成两个超长正整数的加法. 输入两个字符串数字 输出相加后的结果,string型 样例输入:99999999999999999999999999999999999999999999999999 1 样例输出:100000000000000000000000000000000000000000000000000 #include<iostream> #include<string> using namespace std; string add(string num1,

【华为OJ】【061-等差数列】

[华为OJ][算法总篇章] [华为OJ][061-等差数列] [工程下载] 题目描述 功能:等差数列 2,5,8,11,14.... 输入:正整数N >0 输出:求等差数列前N项和 返回:转换成功返回 0 ,非法输入与异常返回-1 输入描述 输入一个正整数. 输出描述 输出一个相加后的整数. 输入例子 2 输出例子 7 算法实现 import java.util.Scanner; /** * Author: 王俊超 * Date: 2015-12-25 16:59 * All Rights Re

【华为OJ】【092-学英语】

[华为OJ][算法总篇章] [华为OJ][092-学英语] [工程下载] 题目描述 Jessi初学英语,为了快速读出一串数字,编写程序将数字转换成英文: 如22:twenty two,123:one hundred and twenty three. 说明 数字为正整数,长度不超过十位,不考虑小数,转化结果为英文小写: 输出格式为twenty two: 非法数据请返回"error": 关键字提示:and,billion,million,thousand,hundred. 方法原型:pu

华为OJ—火车进站(栈,字典排序)

给定一个正整数N代表火车数量,0<N<10,接下来输入火车入站的序列,一共N辆火车,每辆火车以数字1-9编号.要求以字典序排序输出火车出站的序列号.其实也就是输出所有可能的出栈序列. 样例输入: 3 1 2 3 样例输出: 1 2 31 3 22 1 32 3 13 2 1 解答: 其实核心就是一个栈,对于第K个数,在第K个数进栈之前,前面的 K-1 个数要么全部出去了,要么都在栈里面,要么部分在栈里面部分出去了.那么可以假想,在第K个数入栈之前,依次从栈里面出去 0个.1个.2个--栈.si

【华为OJ】【076-蛇形矩阵】

[华为OJ][算法总篇章] [华为OJ][076-蛇形矩阵] [工程下载] 题目描述 题目说明 蛇形矩阵是由1开始的自然数依次排列成的一个矩阵上三角形. 样例输入 5 样例输出 1 3 6 10 15 2 5 9 14 4 8 13 7 12 11 输入描述 输入正整数N(N不大于100) 输出描述 输出一个N行的蛇形矩阵. 输入例子 4 输出例子 1 3 6 10 2 5 9 4 8 7 算法实现 import java.util.Scanner; /** * Author: 王俊超 * Da