「Acwing算法合集」
力扣算法系列文章
一、高精度乘法
题目如下:
给定两个非负整数(不含前导 0) A 和 B,请你计算 A×B 的值。
输入格式
共两行,第一行包含整数 A,第二行包含整数 B。
输出格式
共一行,包含 A×B 的值。
数据范围
1≤A的长度≤100000,
0≤B≤10000
输入样例:
2
3
输出样例:
6
代码如下:
import java.math.BigInteger;import java.util.*;public class Main{ public static void main(String[] args){ Scanner sc = new Scanner(System.in); String o1 = sc.next(); String o2 = sc.next(); BigInteger b1 = new BigInteger(o1); BigInteger b2 = new BigInteger(o2); System.out.println(b1.multiply(b2)); }}
运行结果:
二、高精度除法
题目如下:
给定两个非负整数(不含前导 0) A,B,请你计算 A/B 的商和余数。
输入格式
共两行,第一行包含整数 A,第二行包含整数 B。
输出格式
共两行,第一行输出所求的商,第二行输出所求余数。
数据范围
1≤A的长度≤100000,
1≤B≤10000,
B 一定不为 0
输入样例:
7
2
输出样例:
3
1
代码如下:
import java.math.BigInteger;import java.util.*;public class Main{ public static void main(String[] args){ Scanner sc = new Scanner(System.in); String o1 = sc.next(); String o2 = sc.next(); BigInteger b1 = new BigInteger(o1); BigInteger b2 = new BigInteger(o2); BigInteger[] p = b1.divideAndRemainder(b2); System.out.println(p[0]); System.out.println(p[1]); }}
运行结果:
三、前缀和
题目如下:
输入一个长度为 n 的整数序列。
接下来再输入 m 个询问,每个询问输入一对 l,r。
对于每个询问,输出原序列中从第 l 个数到第 r 个数的和。
输入格式
第一行包含两个整数 n 和 m。
第二行包含 n 个整数,表示整数数列。
接下来 m 行,每行包含两个整数 l 和 r,表示一个询问的区间范围。
输出格式
共 m 行,每行输出一个询问的结果。
数据范围
1≤l≤r≤n,
1≤n,m≤100000,
−1000≤数列中元素的值≤1000
输入样例:
5 3
2 1 3 6 4
1 2
1 3
2 4
输出样例:
3
6
10
代码如下:
import java.util.*;public class Main{ public static void main(String[] args){ Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int k = sc.nextInt(); int[] arr = new int[n]; int[] help = new int[n]; for(int i = 0; i < n; ++i){ arr[i] = sc.nextInt(); } help[0] = arr[0]; for(int i = 1; i < n; ++i){ help[i] = help[i - 1] + arr[i]; } while(k -- > 0){ int l = sc.nextInt(); int r = sc.nextInt(); if(l - 2 < 0){ System.out.println(help[r - 1]); } else{ System.out.println(help[r - 1] - help[l - 2]); } } }}
运行结果:
四、子矩阵的和
题目如下:
输入一个 n 行 m 列的整数矩阵,再输入 q 个询问,每个询问包含四个整数 x1,y1,x2,y2,表示一个子矩阵的左上角坐标和右下角坐标。
对于每个询问输出子矩阵中所有数的和。
输入格式
第一行包含三个整数 n,m,q。
接下来 n 行,每行包含 m 个整数,表示整数矩阵。
接下来 q 行,每行包含四个整数 x1,y1,x2,y2,表示一组询问。
输出格式
共 q 行,每行输出一个询问的结果。
数据范围
1≤n,m≤1000,
1≤q≤200000,
1≤x1≤x2≤n,
1≤y1≤y2≤m,
−1000≤矩阵内元素的值≤1000
输入样例:
3 4 3
1 7 2 4
3 6 2 8
2 1 2 3
1 1 2 2
2 1 3 4
1 3 3 4
输出样例:
17
27
21
代码如下:
import java.util.Scanner;public class Main { public static void main(String[] args){ Scanner sc = new Scanner(System.in); int row = sc.nextInt(); int col = sc.nextInt(); int query = sc.nextInt(); int[][] arr = new int[row][col]; int[][] help = new int[row][col]; for(int i = 0; i < row; ++i){ for(int j = 0;j < col; ++j){ arr[i][j] = sc.nextInt(); } } help[0][0] = arr[0][0]; for(int i = 1; i < col; ++i){ help[0][i] = help[0][i - 1] + arr[0][i]; } for(int i = 1; i < row; ++i) { help[i][0] = help[i - 1][0] + arr[i][0]; } for(int i = 1; i < row; ++i){ for(int j = 1; j < col; ++j){ help[i][j] = help[i - 1][j] + help[i][j - 1] + arr[i][j] - help[i - 1][j - 1]; } } while(query-- > 0){ int row1 = sc.nextInt(); int col1 = sc.nextInt(); int row2 = sc.nextInt(); int col2 = sc.nextInt(); int ans; if(row1 - 2 < 0 && col1 - 2 < 0){ ans = help[row2 - 1][col2 - 1]; System.out.println(ans); continue; } if(row1 - 2 < 0){ ans = help[row2 - 1][col2 - 1] - help[row2 - 1][col1 - 2]; System.out.println(ans); continue; } if(col1 - 2 < 0){ ans = help[row2 - 1][col2 - 1] - help[row1 - 2][col2 - 1]; System.out.println(ans); continue; } ans = help[row2 - 1][col2 - 1] + help[row1 - 2][col1 - 2] - help[row1 - 2][col2 - 1] - help[row2 - 1][col1 - 2]; System.out.println(ans); } }}