大数问题(C++、Java)

有时候,当我们做题的时候会遇到很简答的代码题,例如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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/380186.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

cobalt strick 4.0 系列教程(4)---监听器和基础设施管理

0x01 概述 任何行动的第一步都是建立基础设施。就 Cobalt Strike 而言&#xff0c;基础设施由一个或多个团队服务器、重定向器以及指向你的团队服务器和重定向器的 DNS 记录组成。一旦团队服务器启动并运行&#xff0c;你将需要连接到它并将其配置为接收来自受害系统的连接。监…

【竞赛题解】Codeforces Round #710 (Div. 3)

B. Partial Replacement 题意&#xff1a;有字符串由.和*组成&#xff0c;可标记其中*&#xff0c;首尾的*必须被标记&#xff0c;使被标记的*之间距离不超过k&#xff0c;求最少的标记量 思路&#xff1a;首先从首尾出发确定首尾*的位置&#xff0c;再由首beg出发向后的k个元…

Oracle数据库存储过程 ,去除给定字符串中重复的字符串

以下函数是本人在编写Oracle数据库存储过程时写的函数,觉得该函数通用性较强,因此发表出来供需要的人参考.这个函数的功能主要是用于去除给定字符串中重复的字符串.在使用中需要指定字符串的分隔符.示例:str : MyReplace(13,14,13,444, ,);输出:13,14,444create or replace fun…

基于RBAC模型的通用企业权限管理系统

1. 为什么我们需要基于RBAC模型的通用企业权限管理系统 管理信息系统是一个复杂的人机交互系统&#xff0c;其中每个具体环节都可能受到安全威胁。构建强健的权限管理系统&#xff0c;保证管理信息系统的安全性是十分重要的。权限管理系统是管理信息系统中代码重用性最高的模块…

面向对象 抽象(abstract)

面向对象 抽象&#xff08;abstract&#xff09; 抽象类的概述 A:抽象类概述 抽象就是看不懂的 B:抽象类特点 a:抽象类和抽象方法必须用abstract关键字修饰 abstract class 类名 {}public abstract void eat();b:抽象类不一定有抽象方法&#xff0c;有抽象方法的类一定是抽…

密码学加密算法分类_密码学中的国际数据加密算法(IDEA)

密码学加密算法分类Introduction 介绍 International Data Encryption Algorithm (IDEA) is a type of cryptography as a block cipher algorithm designed by "Xuejia Lai" and "James L.Massey" of ETH-Zrich and was first published in the 1991 yea…

如何定位溢出点位置

程序&#xff1a; #include <stdio.h> void exploit() {system("/bin/sh"); } void func() {char str[20];read(0,str,50);printf("the str is:%s\n",str); } int main() {func();return 0; }关掉保护机制&#xff1a; gcc -no-pie -fno-stack-pro…

.net知识和学习方法系列(六)关于数值类型

过年总是忙&#xff0c;没有更多的时间来写博客&#xff0c;不过还是挺想念这块地方的。 本次博客说一下数值类型吧&#xff01; 不管那种语言&#xff0c;都为数据类型一说&#xff0c;在C#中也是&#xff0c;不过C#的数据类型分了两类&#xff0c;一是值类型&#xff0c;一是…

【竞赛题解】2021年广东工业大学第十五届文远知行杯程序设计竞赛(同步赛)

B 找山坡 题意&#xff1a;在数组中找到两相等元素相距最大的距离且这两元素间的元素都不小于该两端值 思路&#xff1a;采用单调栈 例如&#xff1a;a[] { 2 3 5 4 6 3 }&#xff0c;栈内存储元素的坐标&#xff08;从1开始&#xff09;&#xff0c;便于计算距离 首先将a[…

[转]JAVA AES 加密算法

本文转自&#xff1a;http://blog.sina.com.cn/s/blog_7c8eb1590100svr0.html package com.siro.tools;import javax.crypto.Cipher;import javax.crypto.spec.IvParameterSpec;import javax.crypto.spec.SecretKeySpec;import sun.misc.BASE64Decoder;import sun.misc.BASE64E…

java中Scanner类中 next()与nextLine()的区别

问题&#xff1a;提示用户输入一个英文字符串或者要解密的字符串&#xff0c;然后通过扫描仪获取用户输入的字符串&#xff0c;经过加密或者解密后&#xff0c;把字符串输出。 import java.util.Scanner;public class Encryption {public static void main(String[] args) {Sca…

操作系统中的处理机调度调度_操作系统中的流程分类和调度

操作系统中的处理机调度调度处理 (Process) In the operating system, there are numerous task and application program run simultaneously. A program is stored in the hard disk or any other form of secondary storage. When the program is executed it must be loade…

NX机制及绕过策略-ret2libc

程序&#xff1a; 1.c #include <stdio.h> void exploit() {system("/bin/sh"); } void func() {char str[0x20];read(0,str,0x50); } int main() {func();return 0; }0x01 NX介绍 溢出攻击的本质在于冯诺依曼计算机模型对数据和代码没有明确区分这一先天性缺…

网站SEO策略的制定

在对一个网站做SEO的时候&#xff0c;SEO技术水平类似的人&#xff0c;营销效果可能天壤之别&#xff0c;这是因为网站SEO策略的制定的不同&#xff01;-----这个是最根本的。 SEO技术非常的简单&#xff0c;因为SEO不是去寻找搜索引擎的漏洞&#xff0c;而是根据搜索引…

Python | 程序从列表中删除范围内的所有元素

Given a list and we have to remove elements in a range from the list in Python. 给定一个列表&#xff0c;我们必须从Python中的列表中删除范围内的元素。 删除列表(开始索引&#xff0c;结束索引) (del list(start_index, end_index)) del() method is used to remove a…

面向对象 (接口 Interface)

1&#xff0c;面向对象(接口的概述及其特点) A:接口概述 从狭义的角度讲就是指java中的interface从广义的角度讲对外提供规则的都是接口 B:接口特点 a:接口用关键字interface表示 interface 接口名 {}b:类实现接口用implements表示 class 类名 implements 接口名 {}c:接口…

android unbound prefix

少一个命名空间加上就行了&#xff1a;xmlns:android"http://schemas.android.com/apk/res/android" 转载于:https://www.cnblogs.com/nizuimeiabc1/archive/2011/10/09/4254310.html

【竞赛题解】第22次CCF计算机软件能力认证 B

今天&#xff08;准确说是昨天&#xff0c;一下子就过12点了&#xff09;下午刚参加了CSP认证考试&#xff0c;大概是考了220&#xff08;前两题AC&#xff0c;第三题太折磨了懒得看了&#xff0c;后面两题各混了10分&#xff09;&#xff0c;唯一有点参与感的就是B题了&#x…

gbd调试64位程序关键

程序&#xff1a; 4.c&#xff1a; #include<stdio.h> void exploit() {system("/bin/sh"); } void main() {char buf[20];gets(buf); }编译&#xff1a; gcc -no-pie -fno-stack-protector -m64 -o 4.exe 4.cNX保护&#xff0c;栈数据不可执行 使用命令&…

C#全局鼠标键盘Hook (备查)

using System; using System.Collections.Generic; using System.Reflection; using System.Runtime.InteropServices; using System.Text; using System.Windows.Forms; namespace DCIEngine.FrameWork.Snap { /// <summary> /// 这个类可以让你得到一个在…