大数运算
大数运算的概念
大数运算指最特别大的数进行运算,一般超过计算机能表示的最大数字。核心思想是将这些数字放在一个集合或者数组中,在根据基本的加减乘除的计算规则对大数一位一位的进行计算。这里共整理的四个类型,均为ACwing上的算法基础课中的模板题
Java自带大数类,所以这部分可以不是特别重要,但是也可以掌握一下。
四种类型类:
- 大数+大数
- 大数-大数(答案可以为负数)
- 大数*小数
- 大数/小数
大数运算模板
以下为四个模板
import java.util.*;
import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.math.*;
public class Main{
//加法运算
public static List<Integer> add(List<Integer> a, List<Integer> b){
int t = 0;//进位标志位
List<Integer> c = new ArrayList<>();
for(int i = 0; i < a.size() || i < b.size(); i++){
if(i >= a.size()){
t = t + b.get(i);
}else
if(i >= b.size()){
t = t + a.get(i);
}else{
t = t + a.get(i)+b.get(i);
}
c.add(t % 10);//计算该位的最终答案
t /= 10;//计算是否有进位
}
if(t>0) c.add(1);
return c;
}
public static void main(String[] args)throws IOException{
BufferedReader buffer = new BufferedReader(new InputStreamReader(System.in));
String line1 = buffer.readLine();
String line2 = buffer.readLine();
List<Integer> num1 = new ArrayList<>();
List<Integer> num2 = new ArrayList<>();
for(int i=line1.length()-1; i>=0; i--){
num1.add((int)(line1.charAt(i)-'0'));
}
for(int i=line2.length()-1; i>=0; i--){
num2.add((int)(line2.charAt(i)-'0'));
}
List<Integer> ans = add(num1,num2);
Collections.reverse(ans);
for(int m : ans) System.out.print(m);
}
}
//减法模板
import java.util.*;
import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Main{
public static boolean cmp(List<Integer> a, List<Integer> b){
if(a.size() > b.size()) return true;
if(a.size() < b.size()) return false;
for(int i = a.size()-1; i >= 0; i--){
if(a.get(i)>b.get(i)){
return true;
}
if(a.get(i) < b.get(i)){
return false;
}
}
return true;
}
public static List<Integer> minus(List<Integer> a, List<Integer> b){
int t = 0;
List<Integer> c = new ArrayList<>();
for(int i = 0; i < a.size() || i < b.size(); i++){
int m1 = 0,m2=0;
if( i >= b.size()){
m1 = a.get(i);
m2 = 0;
}
else{
m1 = a.get(i);
m2 = b.get(i);
}
t = t+m1-m2;//若t为-,则需要借位
if(t < 0){
c.add(t+10);
t = -1;
}else{
c.add(t);
t = 0;
}
}
return c;
}
public static void main(String[] args)throws IOException{
BufferedReader buffer = new BufferedReader(new InputStreamReader(System.in));
String line1 = buffer.readLine();
String line2 = buffer.readLine();
List<Integer> num1 = new ArrayList<>();
List<Integer> num2 = new ArrayList<>();
for(int i=line1.length()-1; i>=0; i--){
num1.add((int)(line1.charAt(i)-'0'));
}
for(int i=line2.length()-1; i>=0; i--){
num2.add((int)(line2.charAt(i)-'0'));
}
List<Integer> ans = new ArrayList<>();
if(cmp(num1,num2)) ans = minus(num1,num2);
else{
ans = minus(num2,num1);
System.out.print("-");
}//判断两数的大小
Collections.reverse(ans);
boolean flag = true;
for(int i = 0; i < ans.size(); i++){
if(ans.get(i) == 0 && i != ans.size()-1 && flag){
continue;
}
flag = false;
System.out.print(ans.get(i));
}
}
}
import java.util.*;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.BufferedReader;
public class Main{
//用小数去乘每大数的每一位。
public static List<Integer> mul(List<Integer> a, int b){
int t = 0;//t表示进位
int n = a.size();
List<Integer> ans = new ArrayList<>();
for(int i = 0; i < n; i++){
t += b * a.get(i);
ans.add(t%10);
t /= 10;
}
if(t != 0) ans.add(t);
return ans;
}
public static void main(String[] args)throws IOException{
BufferedReader buffer = new BufferedReader(new InputStreamReader(System.in));
String bigNumStr = buffer.readLine();
int n = bigNumStr.length();
int normalNum = Integer.valueOf(buffer.readLine());
List<Integer> bigNum = new ArrayList<Integer>();
for(int i = n-1; i >= 0; i--){
bigNum.add((int)(bigNumStr.charAt(i)-'0'));
}
List<Integer> ans = mul(bigNum,normalNum);
for(int i = ans.size()-1; i >= 0; i--){
System.out.print(ans.get(i));
}
}
}
import java.util.*;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.BufferedReader;
class Ans{
public List<Integer> result = new ArrayList<>();
public int mod = 0;
}
public class Main{
public static Ans div(List<Integer> a, int b){
Ans ans = new Ans();
int t = 0;//t表示余数
for(int i = a.size()-1; i >= 0; i--){
t = t*10 + a.get(i);
ans.result.add(t/b);
t = t % b;
}
ans.mod = t;
while(ans.result.size()>1 && ans.result.get(0) == 0) ans.result.remove(0);
return ans;
}
public static void main(String[] args)throws IOException{
BufferedReader buffer = new BufferedReader(new InputStreamReader(System.in));
String bigNumStr = buffer.readLine();
int n = bigNumStr.length();
int normalNum = Integer.valueOf(buffer.readLine());
List<Integer> bigNum = new ArrayList<Integer>();
for(int i = n-1; i >= 0; i--){
bigNum.add((int)(bigNumStr.charAt(i)-'0'));
}
Ans ans = div(bigNum,normalNum);
Collections.reverse(ans.result);
for(int i = ans.result.size()-1; i >= 0; i--){
System.out.print(ans.result.get(i));
}
System.out.print("\n" + ans.mod);
}
}