大数加

Posted tomorrow-will-be-better

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大数加相关的知识,希望对你有一定的参考价值。

一、Java类BigInteger实现大数加

1.代码如下:

技术图片
import java.math.BigInteger;
import java.util.Scanner;

public class BigNumberAdd 

    public static void main(String[] args)

        Scanner scanner = new Scanner(System.in);

        String str1 = scanner.nextLine();
        String str2 = scanner.nextLine();

        String result = new BigInteger(str1).add(new BigInteger(str2)).toString();

        System.out.println(result);
    
View Code

 2.测试示例如下:

技术图片

二、Java语言实现

1.思路:

(1)反转两个大整数字符串,便于从低位到高位相加和最高位的进位导致和的位数增加;
(2)对齐两个字符串,即短字符串的高位用‘0’补齐,便于后面的相加;
(3)把两个正整数相加,一位一位的加并加上进位;
(4)最高位有进位则补上。

 

2.代码实现:

技术图片
import java.util.Scanner;

public class BigNumberAdd 

    public static String BigIntegerAdd(String string1,String string2)
        StringBuffer result = new StringBuffer();

        //反转大整数字符串
        string1 = new StringBuffer(string1).reverse().toString();
        string2 = new StringBuffer(string2).reverse().toString();

        int length1 = string1.length();
        int length2 = string2.length();
        int maxLength = length1>length2?length1:length2;

        int index = 0;//进位
        if(length1<length2)
            for(int i = length1;i<length2;++i)
                string1+=‘0‘;
            
        
        else if(length1>length2)
            for(int i = length2;i<length1;++i)
                string2+=‘0‘;
            
        

        for(int i=0;i<maxLength;++i)
            int nSum = Integer.parseInt(string1.charAt(i)+"")+Integer.parseInt(string2.charAt(i)+"")+index;
            int num = nSum%10;
            result.append(num);
            index = nSum/10;
        
        if(index>0)
            result.append(index);
        
        return result.reverse().toString();
    


    public static void main(String[] args)

        Scanner scanner = new Scanner(System.in);

        String addNumber1 = scanner.nextLine();
        String addNumber2 = scanner.nextLine();

        System.out.println(BigNumberAdd.BigIntegerAdd(addNumber1,addNumber2));
    
    
View Code

3.测试示例如下:

技术图片

三、C++语言实现

      1.分析:因为计算机计算的数值位数有限,当要算两个几百位,几千位或者更大位数的加法时,直接输入不能再进行计算,所以要编写程序来模拟加法的运算过程,这样不管多少位的加法问题,都可以计算出来。

      2.基本思路:输入的时候两个数都是以字符串的形式输入的,测出每个字符串的长度(也就是该数的位数),因为字符串不能直接进行运算,所以测出长度之后将字符串形的数反向转化为整形数组的形式(例如输入两个数为100和10,转化为整形数组形式储存为001和01,让低位在前,是运算更方便),然后进行运算。

      要用到两个字符型数组来先保存输入的数,再定义3个整形数组,要将这三个数组中的元素开始的时候全部清零,其中两个来储存将字符型数转化过的整型数,再有一个就是来保存运算结果的数组。

技术图片

     3.代码实现

 

技术图片
#include<iostream>
#include<algorithm>
#include<string>

using namespace std;

int main(void) 
    string addNumber1, addNumber2, result;
    
    //输入两个大整数字符串
    cin >> addNumber1 >> addNumber2;

    //位数较少的大整数字符串放在第二位
    if (addNumber1.size() < addNumber2.size()) 
        string temp = addNumber1;
        addNumber1 = addNumber2;
        addNumber2 = temp;
    
    int length = addNumber1.size() - addNumber2.size();
    string flag(length, 0); //较短的字符串前面补‘0’,使两个字符串等长。
    addNumber2 = flag + addNumber2;

    int index = 0;//进位
    for (int i = addNumber1.size() - 1; i >= 0; --i) 
        int sum = (addNumber1[i] - 0) + (addNumber2[i] - 0) + index;
        if (sum > 9) 
            result.push_back((sum - 10) + 0);
            index = 1;
        
        else 
            result.push_back(sum + 0);
            index = 0;
        
    
    result.push_back(index + 0);

    //去掉结果的前置0
    for (int i = result.size() - 1; i >= 0; --i) 
        if (result[i] == 0) 
            result.pop_back();
        
        else 
            break;
        
    

    //大整数和逆序输出
    for (string::reverse_iterator item = result.rbegin(); item != result.rend(); ++item) 
        cout << *item;
    
    cout << endl;

    return 0;
View Code

    4.测试示例:

 技术图片

 

以上是关于大数加的主要内容,如果未能解决你的问题,请参考以下文章

如何加大tomcat连接数

java求两个数中的大数

(母函数 Catalan数 大数乘法 大数除法) Train Problem II hdu1023

大数组合数

Secret Project Gym - 101972(组合数大数+思维)

HDU 1023 Traning Problem 大数卡特兰数