有时候,当我们做题的时候会遇到很简答的代码题,例如A+B,但是题是有前提的,就是两个数特别的大。妈耶~~~
大家都知道,定义一个变量,系统会自动为该变量分配空间,例如:int类型在c中,占2个字节,也就是16位,即可以存储0~216-1这么大的数,如果再大,就算是long long int也会溢出报错。
咋办捏?
这时候,大数问题出来了

C++版

一、大数相加

大数相加思路:

   1   2   3   4   5   6   7   8   9   1   5   4   7   8   9   6   3   5   1   2   4   5   8   7   4   2
+                    1   8   9   6   4   5   8   9   6   3   1   4   5   6   3   5   8   9   6   2   9   8
=     1   2   3   4   6   14  16  14  7   6   13  13  13  11  10  10  8   11  4   7   12  14  14  9   13  10
满十向前一位进一
=     1   2   3   4   7    5   7   5  3   7   4    4   4   2   1   0  9   1   4   8   3   5   5   0   4   0

首先,从最低位对应相加,之后再进行每一位判断,若满十,将取余保留,取整加到前一位即可。

(大数输入绝大多数是以字符串接收)

核心代码如下:

string BigNumAdd(const string& strNum1, const string& strNum2)
{string strSum;//用来存储最后的结果int len1 = strNum1.size()-1;//获取第一个数的长度int len2 = strNum2.size()-1;//获取第二个数的长度int bit = 0;                //保存进位//从结尾开始每位相加 while (len1>=0 && len2>=0){//分别从两数的末尾开始相加 由于是字符的形式,而接下来需要对数进行取余和取整的操作,所以这时要将每个位求和之后获得整数的形式,需要   -‘0’int tmpSum = strNum1[len1]-'0' + strNum2[len2]-'0' + bit;//求每位的和(要把进位也加上)strSum += tmpSum % 10 + '0';//保存进结果 bit = tmpSum / 10;//求进位 --len1;--len2; }//两个整数长度不相等(肯定有一个已经加完了,不需要再额外加if来判断,因为while就可以判断)while (len1 >= 0)//说明第一个数要大些,这时候,第二个数已经没法与第一数位数对应了{//和上个while循环一样int tmpSum = strNum1[len1]-'0' + bit;//获得数字形式strSum += tmpSum % 10 + '0';//保存进结果 bit = tmpSum / 10;//求进位--len1; }while (len2 >= 0) {//和上个while循环一样int tmpSum = strNum2[len2]-'0' + bit;//获得数字形式strSum += tmpSum % 10 + '0';//保存进结果 bit = tmpSum / 10;//求进位--len2; }//当跳出三个循环之后,bit最后存储的是最高一位数的进位与否,进行判断//最高位有进位if (bit != 0)//需要进位strSum += bit + '0'; //由于咱们是从低位开始以次存入字符串里的,所以最后的输出得逆序输出reverse(strSum.begin(), strSum.end()); //反转return strSum;
}

二、大数相乘

大数相乘思路:

                 1   2   3   4   5   7   8   9   6   3   5   9   8*                                      6   3   5   1   4=                 4   8   12  16  20  28  32  36  24  12  20  36  32      4与第一个数的各个位相乘
=          1   2   3   4   5   7   8   9   6   3   5   9   8           1与第一个数的各个位相乘
=       5  10  15  20  25  35  40  45  30  15  25  45  40              5与第一个数的各个位相乘
=     3  6  9   12  15  21  24  27  18  9   15  27  24                     3与第一个数的各个位相乘
=  6  12 18 24  30  42  48  54  36  18  30  54  48                         6与第一个数的各个位相乘
然后,与加法相同,竖行每一列对应为相加,可以进位则向前进位
=  6  15 29 44  63  88  110 134 130 117 110 126 127 86  69  44  32
=  7  8  4  1   3   0   4   8   2   9   3   9   6   3   3   7   2

首先,将相对小的数的最低位与相对大的数的每一位进行相乘,然后相对小的数的倒数第二位数再以次与相对大的数的每一位相乘…直到相对小的数的最高位与相对大的数的每一位相乘之后,再以次求和相加即可。

核心代码如下:

string BigNumMultiply(const string& strNum1, const string& strNum2)
{string strMultiply;//两数相乘最大有m+n位int bit = 0;//保留进位int len1 = strNum1.size()-1;//获取第一个数的长度int len2 = strNum2.size()-1;//获取第二个数的长度//计算每一位 for (int i=0; i<len1+len2+2; ++i){//计算结果的第i位(权值肯定为i,第1位也就是个位权值为0(pow(10, 0))) //等于乘数的第(i~0)位分别与被乘数的第(0~i)位相乘,因为这样每位相乘之后权值仍为i //然后相加再加上前一位的进位,就是结果的第i位//然后%10得出第i位,/10得到进位int tmp = 0;for (int j=i; j>=0; --j){//如果下标超出字符串的范围   j为num1的下标, i-j为num2的下标,然后两数相乘 if (j>len1 || (i-j)>len2)continue;//还要注意字符串数字的最高位在字符串的最低位所以得用len减去 tmp += (strNum1[len1-j]-'0') * (strNum2[len2-(i-j)]-'0');//从低位开始加,一列一列相加,相错相乘再相加}//加上进位tmp += bit;//为了防止最后一位是0,但是却加上了if (tmp == 0 && i == len1+len2+1) //最后一位,也就是最高位为0,则没必要往strMultiply 该字符串里面存,因为逆序输出的时候,0是最高位,没有意义的。break;//求余得到结果的第i位strMultiply += tmp % 10 + '0';//计算新的进位bit = tmp / 10;
}//反转reverse(strMultiply.begin(), strMultiply.end()); return strMultiply;
}

三、大数阶乘

核心代码如下:
    string rlt("1");string opNum;for (int i=1; i<=n; ++i){//ss不可以定义在for循环外stringstream ss; ss << i;ss >> opNum;rlt = BigNumMultiply(rlt, opNum); }

Java版

一、大数相乘

计算两个非负整数 A,B的乘积,A,B可能会很大。

输入格式
第一行输入一个非负整数 A。

第二行输入一个非负整数 B。

A,B的长度不大于 500。

输出格式
输出 A×B 的值。

样例输入
4321
1234
样例输出
5332114

代码如下:

import java.math.BigInteger;//导入相关的BigInteger包
import java.util.Scanner;//导入扫描仪Scanner
public class main {public static void main(String[] args) {  Scanner sq=new Scanner(System.in);  BigInteger a,b,result2;  a=sq.nextBigInteger();  b=sq.nextBigInteger();  result2=a.multiply(b);  System.out.println(result2);  }
}

二、大数相加

计算两个非负整数A,B的和。不过这一次有些特殊A,B可能会很大。

输入格式
第一行输入一个非负整数A。
第二行输入一个非负整数B。
A,B的长度不大于 500。
输出格式
输出A+B的值。不要有多余的前导零。
样例输入
123000000000
1234000000000
样例输出
1357000000000

代码如下:

import java.math.BigDecimal;
import java.util.Scanner;
public class bigteger {public static void main(String[] args) {BigDecimal a,b,c;Scanner sq=new Scanner(System.in);while(true){a=sq.nextBigDecimal();b=sq.nextBigDecimal();c=a.add(b);if(c.compareTo(BigDecimal.ZERO) == 0)//此处equal是不可以的,因为会将精度也算进去System.out.println("0");elseSystem.out.println(c.stripTrailingZeros().toPlainString());}
}
}
BigDecimal是处理高精度的浮点数运算的常用的一个类
一般直接使用 BigDecimal.toString()方法即可以完成浮点数的打印。System.out.println( new BigDecimal("100.000").toString());     100.000System.out.println( new BigDecimal("100.000").stripTrailingZeros().toString());        1E+2stripTrailingZeros()函数就是用于去除末尾多余的0的,而输出是科学计数法System.out.println( new BigDecimal("100.000").stripTrailingZeros().toPlainString());       100
用toPlainString()函数代替toString(),避免输出科学计数法的字符串

(保留小数点的方法)代码如下:

import java.math.BigDecimal;
import java.util.Scanner;
public class Main {public static void main(String[] args) {BigDecimal a,b,c;Scanner sq=new Scanner(System.in);a=sq.nextBigDecimal();b=sq.nextBigDecimal();c=a.add(b);BigDecimal e=c.setScale(2,BigDecimal.ROUND_HALF_UP);//里面的2这个参数代表保留两位小数System.out.println(e);}
}

详细博文参考:https://blog.csdn.net/qq_39101581/article/details/78624617

大数问题(C++、Java)相关推荐

  1. 大数相乘、大数相加、大数相减Java版本

    为什么80%的码农都做不了架构师?>>>    题目:两个非常大的数字相乘(相加,相减) 该题目在java中可以使用BigInteger类中的方法来实现.否则的话可以使用如下方式来实 ...

  2. java棋盘问题_0x03大数问题(JAVA解决棋盘覆盖,A+B Problem II)

    常见的有棋盘覆盖和A+B问题,这类问题牵扯到的数值都比较大,如果用一般的数值类型,肯定输出不了,所以就要想一个办法,怎么把大数转换一下输出. A+B Problem II 时间限制:3000 ms | ...

  3. 蓝桥杯-区间k大数查询(java)

    算法训练 区间k大数查询 时间限制:1.0s 内存限制:256.0MB问题描述给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个.输入格式第一行包含一个数n,表示序列长度.第二行包含n个 ...

  4. 51 Nod 1027 大数乘法【Java大数乱搞】

    1027 大数乘法 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 给出2个大整数A,B,计算A*B的结果. Input 第1行:大数A 第2行:大数B (A,B的长度 ...

  5. 比较两个数或者三个数的大小,输出较大数的值 Java

    比较两个数或者三个数的大小,输出较大数的值 1.比较两个数的大小,输出较大数的值 代码如下: import java.util.Scanner; public class Compare {publi ...

  6. 大数运算(Java)

    import java.math.BigInteger; import java.util.Scanner;public class BigNumber {public static void mai ...

  7. java中大数开方_Java中的大数运算

    # 一:大数运算出现的背景 java里面整型int与浮点型float,double它们存放数据的范围是有限的,当出行更大的数值时会发生溢出. 最典型的场景是金融行业,直接使用单精度或者双精浮点数来表示 ...

  8. Java的学习与java大数运算

    之前就学过一点java,但太久没用知识点早就还给书本,之前在实验室搞到一本java的书,今天来重新温习一下 java的语法大部分和c++语言是一样的,入门非常快,所以在这里基础语句的用法就省略了 输出 ...

  9. JAVA简单大数运算

    在准备蓝桥杯比赛的时候,偶然间老师说在大数运算中java有这巨大的优势,刚好自己也在学习java,于是就查了一些资料,看了一下,java的大数运算,看完之后确实感觉比c/c++语言要方便的多.于是就写 ...

  10. zoj3344 第一类斯特林数+java大数

    题意:有个游戏,两个人玩.有n个卡片,洗牌后放入编号为1到n的盒子里,然后两个人轮流做如下操作,拿出盒子中编号最小的卡片k,然后再去编号为k的盒子中拿出卡片,依次类推,直到没有卡片可拿为止.拿走最后一 ...

最新文章

  1. java右移位_java、、移位操作方法
  2. mysql 5.7 修改密码_又忘记密码啦?教你几种更改密码的方式
  3. c 语言冒泡排序,c 语言冒泡排序
  4. php成绩查询系统的学习心得_PHP学习心得与体会
  5. golang变量定义细节及beego环境搭建细节记录
  6. 论亚马逊QLDB与腾讯TDSQL对历史数据的管理和计算
  7. 文件上传案例——客户端和服务端套接字
  8. 【转载】浏览器缓存详解:expires cache-control last-modified
  9. 【OpenGL】理解GL_TRIANGLE_STRIP等绘制三角形序列的三种方式
  10. leetcode876. 链表的中间结点
  11. 【kafka】Kafka 2.0 ConsumerGroupCommand新功能
  12. Typora 段落如何快速首行缩进两个字符
  13. 小米和联想的“骁龙”之争,首发第一,友谊第二
  14. Presenting view controllers on detached view controllers is discouraged的解决方案
  15. 用*打印一个长方形.
  16. Android 系统名字、版本、API level的对应关系
  17. easyExcel设置水印
  18. Generating Event Causality Hypotheses through Semantic Relation
  19. Linux DAC 权限管理详解
  20. IMX6DL 在Android4.4.2版本插入SD卡不能开机

热门文章

  1. linux 秒数转时间格式,通过delphi将秒数转换成日期格式
  2. CSS块元素水平垂直居中的实现技巧
  3. 点a链接写邮件小技巧
  4. django组件 分页器
  5. Java FlameGraph 火焰图
  6. Oracle SQL精妙SQL语句讲解(二)
  7. 辨异 —— 行星 vs 恒星
  8. nginx 配置优化详解
  9. TClientDataSet使用要点
  10. POJ3096Surprising Strings(map)