> 文档中心 > 「Acwing算法合集」

「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); }    }}

运行结果:

在这里插入图片描述