温馨提示!
文中代码均于VScode程序中正常运行,使用其他软件程序请适当做出对应的调整!!
代码压缩包:
And 1.简单逻辑算法
no01九九乘法表系列
no02星星系列
no03完数
no04斐波纳契数列
no05水仙花数
no06阶乘
no07回文数
no08输出最大值和最小值
no01九九乘法表系列
完整代码
public class no01九九乘法表系列 {// 保持与java文件名称相对应
public static void main(String[] args) {// 文件程序的主方法,这里用于调用其他代码块
// 控制
hr();// hr分割
main0();// 调用常规99乘法表
hr();
main1();// 调用常规乘法表列倒叙
hr();
main2();// main1左右翻转
hr();
main3();// main0左右翻转
// 控制
}
public static void hr() {// 代码分割
char character = '-'; // 打印字符
int count = 81; // 重复数
for (int i = 0; i < count; i++) {
System.out.print(character);
}
System.out.print("\n");
}
public static void main0() {// 常规99乘法表
for (int i = 1; i <= 9; i++) { // 控制行,从1开始循环
for (int j = 1; j <= i; j++) { // 控制每行对应的数
System.out.print(i + "*" + j + "=" + i * j + "\t");
}
// 第一次循环i是1 j也是1 结果1*1=1 这是图1第一种
// 第二次循环i是2 j是1和2 结果2*1=2 2*2=4
// 第三次循环i是3 j是1、2、3 结果3*1=3 3*2=6 3*3=9
// 同理
System.out.println();// 每次循环完换行
}
}
public static void main1() {// 常规乘法表列倒叙
// 添加第二个程序的代码
for (int i = 9; i >= 1; i--) { // 控制行,从9开始循环
for (int j = 1; j <= i; j++) { // 控制每行对应的数
System.out.print(i + "*" + j + "=" + i * j + "\t");
}
// 第一次循环i是9 j也是1到9 9*1 9*2.... 这是第二图
// 第二次循环i是8 j是1到8
// 同理
System.out.println();// 每次循环完换行
}
}
public static void main2() {
for (int i = 9; i >= 1; i--) { // 控制行,从9开始循环
for (int m = 1; m <= 9 - i; m++) {
System.out.print("\t");// 控制每行对应的数
// 第一次i=9的时候m是false不运行
// 第二次i=8的时候m是1,运行一次
// i=7,运行2次 同理 关键是9-i要想到
}
for (int j = 1; j <= i; j++) { // 控制每行对应的数
System.out.print(i + "*" + j + "=" + i * j + "\t");
}
// 第一次循环i是9 j也是1到9
// 第二次循环i是8 j是1到8
// 同理
System.out.println();// 每次循环完换行
}
}
public static void main3() {
for (int i = 1; i <= 9; i++) { // 控制行,从9开始循环
for (int m = 9; m > i; m--) {
System.out.print("\t");// 控制每行对应的数
// 第一次i=1的时候m循环8次
// 第二次i=2的时m循环7次
// 同理
}
for (int j = 1; j <= i; j++) { // 控制每行对应的数
System.out.print(i + "*" + j + "=" + i * j + "\t");
}
// 第一次循环i是1 j也是1到1
// 第二次循环i是2 j是1和2
// 同理
System.out.println();// 每次循环完换行
}
}
}
no02星星系列
完整代码
public class no02星星系列 {
public static void main(String[] args) {
hr();
main0();// 平行四边形
hr();
main1();// 实心正三角形
hr();
main2();// 实心菱形
hr();
main3_0();// 空心菱形1
main3_1();// 空心菱形2
hr();
main4();// 空心正三角形
}
public static void hr() {// 代码分割
char character = '-'; // 打印字符
int count = 30; // 重复数
for (int i = 0; i < count; i++) {
System.out.print(character);
}
System.out.print("\n");
}
public static void main0() {
for (int i = 1; i <= 5; i++) {// i控制行,共5行
for (int j = 5; j > i; j--) {// j控制每一行的数量
System.out.print(" ");// 输出错误用其他字符代替一下
// i=1 j=4,3,2,1 输出4个空格
// i=2 j循环3次空格 同理
}
for (int k = 1; k <= 5; k++) {
System.out.print("*");
// K控制每行多少个 都是5个
}
System.out.println();
}
}
public static void main1() {
for (int i = 1; i <= 5; i++) {// i控制行,共5行
for (int j = 5; j > i; j--) {// j控制每一行的数量
System.out.print(" ");// 输出错误用其他字符代替一下
// i=1 j=4,3,2,1 输出4个空格
// i=2 j循环3次空格 同理
}
for (int k = 1; k <= (2 * i) - 1; k++) {
System.out.print("*");
// i=1 k=1
// i=2 K=3同理,3就是循环了3次*
}
System.out.println();
}
}
public static void main2() {
for (int i = 1; i <= 5; i++) {// i控制行,共5行
for (int j = 5; j > i; j--) {// j控制每一行的数量
System.out.print(" ");
// i=1 j=4,3,2,1 输出4个空格
// i=2 j循环3次 同理
}
for (int k = 1; k <= (2 * i) - 1; k++) {
System.out.print("*");
// i=1 k=1
// i=2 K=3同理,3就是循环了3次*
}
System.out.println();
} // 下面新的循环是控制倒的三角
for (int ii = 4; ii >= 1; ii--) { // ii控制行,共4行,倒3角有4行
for (int jj = 1; jj <= 5 - ii; jj++) {// jj控制每一行的数量
System.out.print(" ");
// 发现ii=4时候 jj循环1次 ii=3 jj循环2次
}
for (int kk = 1; kk <= (2 * ii) - 1; kk++) {
System.out.print("*");
// ii=4 kk=7 就是7颗*
// ii=3 Kk=3同理,3就是循环了3次*
}
System.out.println();
}
}
public static void main3_0() {
for (int i = 1; i <= 5; i++) {// i控制行,共5行
for (int j = 5; j > i; j--) {// j控制每一行的数量
System.out.print(" ");
// i=1 j=4,3,2,1 输出4个空格
// i=2 j循环3次 同理
}
for (int k = i; k == i; k++) {// 即每次循环画1次
System.out.print("*");
// 前面画完空格 再接1颗*即可
}
for (int m = 2; m < 2 * i - 1; m++) {
System.out.print(" ");// 这是空格的规律从第二行开始
// i=1,不运行 i=2 2<3 第二行只循环1次空格
}
if (i > 1) {
for (int kk = i; kk == i; kk++) {
System.out.print("*");
// 因为第一行已经有了。所以第二行开始
}
}
System.out.println();
} // 下面新的循环是控制倒的三角,同理
for (int ii = 4; ii >= 1; ii--) { // ii控制行,共4行,倒3角有4行
for (int jj = 1; jj <= 5 - ii; jj++) {// jj控制每一行的数量
System.out.print(" ");
// 发现ii=4时候 jj循环1次 ii=3 jj循环2次
}
for (int kk = ii; kk <= ii; kk++) {
System.out.print("*");
}
for (int m = 2; m < 2 * ii - 1; m++) {
System.out.print(" ");
}
if (ii > 1) {
for (int kk = ii; kk <= ii; kk++) {
System.out.print("*");
}
}
System.out.println();
}
}
public static void main3_1() {
for (int i = 1; i <= 5; i++) {// i控制行,共5行
for (int j = 5; j > i; j--) {// j控制每一行的数量
System.out.print(" ");
// i=1 j=4,3,2,1 输出4个空格
// i=2 j循环3次 同理
}
for (int m = 1; m <= 2 * i - 1; m++) {
if (m == 1 || m == 2 * i - 1) {
System.out.print("*");// 这是直接来判断开头和结尾
// i=1 m=1 进判断 循环1次*
// i=2 m=1,2,3 正常循环3次 进判断,1时候打印*,m==2*2-1==3 所以m=2时候是空格 3时候才是*
} else {
System.out.print(" ");
}
}
System.out.println();
} // 下面新的循环是控制倒的三角,同理
for (int ii = 4; ii >= 1; ii--) { // ii控制行,共4行,倒3角有4行
for (int jj = 1; jj <= 5 - ii; jj++) {
System.out.print(" ");
}
for (int m = 1; m <= 2 * ii - 1; m++) {
if (m == 1 || m == 2 * ii - 1) {
System.out.print("*");
} else {
System.out.print(" ");
}
}
System.out.println();
}
}
public static void main4() {
for (int i = 1; i <= 5; i++) {// i控制行,共5行
for (int j = 5; j > i; j--) {// j控制每一行的数量
System.out.print(" ");
// i=1 j=4,3,2,1 输出4个空格
// i=2 j循环3次 同理
}
for (int m = 1; m <= 2 * i - 1; m++) {
if (m == 1 || m == 2 * i - 1 || i == 5) {
System.out.print("*");// 这是直接来判断开头和结尾
// i=1 m=1 进判断 循环1次*
// i=2 m=1,2,3 正常循环3次 进判断,1时候打印*,m==2*2-1==3 所以m=2时候是空格 3时候才是*
// 补一个i==5就行了,就直接打印9颗,m<=9
} else {
System.out.print(" ");
}
}
System.out.println();
}
}
}
no03完数
完整代码
import java.util.Scanner;
public class no03完数 {
public static void main(String[] args) {
hr();
main0();// 用户输入判断
hr();
main1();// 区间存在
}
public static void hr() {// 代码分割
char character = '-'; // 打印字符
int count = 10; // 重复数
for (int i = 0; i < count; i++) {
System.out.print(character);
}
System.out.print("\n");
}
public static void main0() {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入一个整数:");
int a = scanner.nextInt();
int sum = 0;
for (int i = 1; i < a; i++) {
if (a % i == 0) {
sum += i;
System.out.println(i);
}
}
if (sum == a) {
System.out.println(a + "是完数");
} else {
System.out.println(a + "不是完数");
}
}
public static void main1() {
for (int a = 100; a < 1000; a++) {
int sum = 0;
for (int i = 1; i < a; i++) {
if (a % i == 0) {
sum += i;
}
}
if (sum == a) {
System.out.println("100到999之间的完数有:" + a);
}
}
}
}
no04斐波纳契数列
完整代码
public class no04斐波纳契数列 {
public static void main(String[] args) {
int b = 1;
int a = 0;
for (int m = 1; m < 6; m++) {
System.out.print(a + "\t" + b + "\t");
a = a + b;
b = a + b;
}
}
}
no05水仙花数
完整代码
import java.util.Scanner;
public class no05水仙花数 {
public static void main(String[] args) {
hr();
main0();// 区域存在
main1();// 输入判断
}
public static void hr() {// 代码分割
char character = '-'; // 打印字符
int count = 50; // 重复数
for (int i = 0; i < count; i++) {
System.out.print(character);
}
System.out.print("\n");
}
public static void main0() {
for (int a = 100; a < 1000; a++) {
int b = a / 100; // 百位
int c = a % 10; // 个位
int d = a / 10 % 10;// 十位 a == Math.pow(b,3) + Math.pow(c,3) + Math.pow(d,3)
if (a == b * b * b + c * c * c + d * d * d) {
System.out.println(a + "这是水仙数");
}
}
}
public static void main1() {
try {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入一个三位的正整数:");
int a = scanner.nextInt();
int b = a / 100; // 百位
int c = a % 10; // 个位
int d = a / 10 % 10;// 十位
if (a == b * b * b + c * c * c + d * d * d) {
System.out.println(a + "这是水仙数");
} else {
System.out.println(a + "不是水仙数");
}
} catch (Exception e) {
System.out.println("您的输入有误!");
}
}
}
no06阶乘
完整代码
public class no06阶乘 {
public static void main(String[] args) {
jieChenHe1();
jieChenHe2();
}
public static void jieChenHe1() {
long sum = 0;
int n = 5;
for (int i = 1; i <= n; i += 2) { // 求1!+3!+5!
long temp = 1;
for (int j = 1; j <= i; j++) {
temp *= j;
}
sum += temp;
}
System.out.println("1!+3!+5!= " + sum);
}
public static void jieChenHe2() {
int sum = 0;
int n = 5;
int factorial = 1;
for (int i = 1; i <= n; i++) {
factorial *= i;
sum += factorial;
}
System.out.println("1到5的阶乘和: " + sum);
}
}
no07回文数
完整代码
import java.util.Scanner;
public class no07回文数 {
public static void main(String[] args) {
try {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入一个数:");
int i = scanner.nextInt();
int temp = i;
int num = 0;
while (i != 0) {
int ge = i % 10;
i = i / 10;
num = num * 10 + ge;
}
if (temp == num) {
System.out.println("这是回文数");
} else {
System.out.println("这不是回文数");
}
} catch (Exception e) {
System.out.println("输入有误!");
}
}
}
no08输出最大值和最小值
完整代码
//////////////////////////////
//输入10个数,输出最大值和最小值
//////////////////////////////
import java.util.Scanner;
public class no08输出最大值和最小值 {
public static void main(String[] args) {
// getMaxAndMin();
newgetMaxAndMin();// 优化
}
public static void getMaxAndMin() {
try {
Scanner sc = new Scanner(System.in);
System.out.println("请输入第1个数:");
// 把第一次输入的数字赋给max和min
int num1 = sc.nextInt();
int max = num1;
int min = num1;
int count = 2;
while (count <= 10) {
System.out.println("请输入第" + count + "个数字:");
int numx = sc.nextInt();
if (numx > max) {
max = numx;// 比最大的值还大
} else if (numx < min) {
min = numx;// 比最小的值还小
}
count++;
}
System.out.println("最大值:" + max + ", 最小值:" + min);
} catch (Exception e) {
System.out.println("输入错误,请重新输入!!!");
getMaxAndMin();
}
}
public static void newgetMaxAndMin() {
try {
Scanner sc = new Scanner(System.in);
System.out.println("请输入第1个数:");
// 把第一次输入的数字赋给max和min
int num1 = sc.nextInt();
int max = num1;
int min = num1;
int count = 2;
while (count <= 10) {
try {
System.out.println("请输入第" + count + "个数字:");
int numx = sc.nextInt();
if (numx > max) {
max = numx;// 比最大的值还大
} else if (numx < min) {
min = numx;// 比最小的值还小
}
count++;
} catch (Exception e) {
System.out.println("输入错误,请重新输入!!!");
sc = new Scanner(System.in);
}
}
System.out.println("最大值:" + max + ", 最小值:" + min);
} catch (Exception e) {
System.out.println("输入错误,请重新输入!!!");
getMaxAndMin();
}
}
}
And 2.经典的排序算法
no01冒泡排序
no02选择排序
no03插入排序
no04归并排序
no05希尔排序
no06快速排序
no07堆排序
no08基数排序
no01冒泡排序
完整代码
public class no01冒泡排序 {
public static void main(String[] args) {
main0();
System.out.println("\n");
main1();// 优化
}
public static void main0() {
int[] a = new int[] { 3, 1, 6, 2, 5 };
// 外层for循环控制轮数,循环数组长度-1轮
for (int i = 0; i < a.length - 1; i++) {
// 内层for循环控制比较的次数
for (int k = 0; k < a.length - 1 - i; k++) {
if (a[k] > a[k + 1]) {
var c = a[k];
a[k] = a[k + 1];
a[k + 1] = c;
}
}
}
// 使用循环打印数组元素
for (int i = 0; i < a.length; i++) {
System.out.print(a[i] + " ");
}
}
public static void main1() {
int[] a = new int[] { 3, 1, 4, 886, 2, 5 };
Boolean Sort = false;
// 外层for循环控制轮数,循环n-1轮
for (int i = 0; i < a.length - 1; i++) {
// 内层for循环控制比较的次数
if (!Sort) {
Sort = true;
for (int k = 0; k < a.length - 1 - i; k++) {
if (a[k] > a[k + 1]) {
var c = a[k];
a[k] = a[k + 1];
a[k + 1] = c;
Sort = false;
}
}
} else {
break;
}
}
for (int m = 0; m < a.length; m++) {
System.out.print(a[m] + " ");
}
}
}
no02选择排序
完整代码
public class no02选择排序 {
public static void main(String[] args) {
int[] arr = new int[] { 11, 2, 33, 24, 15 };
for (int i = 0; i < arr.length - 1; i++) {
int k = i;
for (int j = k + 1; j < arr.length; j++) {
if (arr[j] < arr[k]) {
k = j;
}
}
if (k != i) {
int t = arr[k];
arr[k] = arr[i];
arr[i] = t;
}
}
for (int m = 0; m < arr.length; m++) {
System.out.print(arr[m] + "\t");
}
}
}
no03插入排序
完整代码
public class no03插入排序 {
public static void main(String[] args) {
int[] arr = new int[] { 11, 2, 33, 24, 15 };
for (int i = 0; i < arr.length; i++) {
// arr[j]~arr[j-1]
for (int j = i; j > 0; j--) {
if (arr[j] < arr[j - 1]) {
int t = arr[j];
arr[j] = arr[j - 1];
arr[j - 1] = t;
} else {
break;
}
}
}
for (int m = 0; m < arr.length; m++) {
System.out.print(arr[m] + "\t");
}
}
}
no04归并排序
完整代码
public class no04归并排序 {
public static void main(String[] args) {
int[] arr = new int[] { 11, 2, 33, 24, 15 };
mergeSort(arr, 0, arr.length - 1);
System.out.println("排序后的数组:");
for (int num : arr) {
System.out.print(num + " ");
}
}
public static void mergeSort(int[] arr, int left, int right) {
if (left < right) {
int mid = (left + right) / 2;
// 分割数组:递归调用mergeSort对左右两部分进行归并排序
mergeSort(arr, left, mid);
mergeSort(arr, mid + 1, right);
// 合并有序数组
merge(arr, left, mid, right);
}
}
public static void merge(int[] arr, int left, int mid, int right) {
int n1 = mid - left + 1;
int n2 = right - mid;
int[] L = new int[n1];
int[] R = new int[n2];
// 将数据复制到临时数组L和R
for (int i = 0; i < n1; i++) {
L[i] = arr[left + i];
}
for (int j = 0; j < n2; j++) {
R[j] = arr[mid + 1 + j];
}
// 归并临时数组L和R
int i = 0, j = 0;
int k = left;
while (i < n1 && j < n2) {
if (L[i] <= R[j]) {
arr[k] = L[i];
i++;
} else {
arr[k] = R[j];
j++;
}
k++;
}
// 复制剩余的元素
while (i < n1) {
arr[k] = L[i];
i++;
k++;
}
while (j < n2) {
arr[k] = R[j];
j++;
k++;
}
}
}
no05希尔排序
完整代码
public class no05希尔排序 {
public static void main(String[] args) {
int[] arr = new int[] { 11, 2, 33, 24, 15 };
shellSort(arr);
System.out.println("排序后的数组:");
for (int num : arr) {
System.out.print(num + " ");
}
}
public static void shellSort(int[] arr) {
int n = arr.length;
// 初始步长为数组长度的一半,然后逐步减小步长
for (int gap = n / 2; gap > 0; gap /= 2) {
// 对每个步长进行插入排序
for (int i = gap; i < n; i++) {
int temp = arr[i];
int j = i;
// 在当前步长下,将元素插入到正确的位置
while (j >= gap && arr[j - gap] > temp) {
arr[j] = arr[j - gap];
j -= gap;
}
arr[j] = temp;
}
}
}
}
no06快速排序
完整代码
public class no06快速排序 {
public static void main(String[] args) {
int[] arr = new int[] { 11, 2, 33, 24, 15 };
quickSort(arr, 0, arr.length - 1);
System.out.println("排序后的数组:");
for (int num : arr) {
System.out.print(num + " ");
}
}
public static void quickSort(int[] arr, int low, int high) {
if (low < high) {
// 将数组划分为两部分,获取中间位置pivot
int pivot = partition(arr, low, high);
// 分别对左右部分进行递归快速排序
quickSort(arr, low, pivot - 1);
quickSort(arr, pivot + 1, high);
}
}
public static int partition(int[] arr, int low, int high) {
// 选择最右边的元素作为基准值
int pivot = arr[high];
int i = low - 1;
for (int j = low; j < high; j++) {
if (arr[j] < pivot) {
i++;
// 交换arr[i]和arr[j]
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
// 将基准元素放到正确的位置
int temp = arr[i + 1];
arr[i + 1] = arr[high];
arr[high] = temp;
return i + 1;
}
}
no07堆排序
完整代码
public class no07堆排序 {
public static void main(String[] args) {
int[] arr = new int[] { 11, 2, 33, 24, 15 };
heapSort(arr);
System.out.println("排序后的数组:");
for (int num : arr) {
System.out.print(num + " ");
}
}
public static void heapSort(int[] arr) {
int n = arr.length;
// 构建最大堆
for (int i = n / 2 - 1; i >= 0; i--) {
heapify(arr, n, i);
}
// 逐个将最大元素移到数组末尾并调整堆
for (int i = n - 1; i > 0; i--) {
// 将堆顶元素(最大值)与当前未排序区域的末尾元素交换
int temp = arr[0];
arr[0] = arr[i];
arr[i] = temp;
// 在剩余未排序的区域构建最大堆
heapify(arr, i, 0);
}
}
public static void heapify(int[] arr, int n, int i) {
int largest = i; // 初始化父节点为最大节点
int left = 2 * i + 1; // 左子节点索引
int right = 2 * i + 2; // 右子节点索引
// 如果左子节点大于父节点,标记左子节点为最大节点
if (left < n && arr[left] > arr[largest]) {
largest = left;
}
// 如果右子节点大于父节点,标记右子节点为最大节点
if (right < n && arr[right] > arr[largest]) {
largest = right;
}
// 如果最大节点不是父节点,则交换父节点和最大节点,并递归调整堆
if (largest != i) {
int temp = arr[i];
arr[i] = arr[largest];
arr[largest] = temp;
heapify(arr, n, largest);
}
}
}
no08基数排序
完整代码
public class no08基数排序 {
public static void main(String[] args) {
int[] arr = new int[] { 11, 2, 33, 24, 15 };
radixSort(arr);
System.out.println("排序后的数组:");
for (int num : arr) {
System.out.print(num + " ");
}
}
public static void radixSort(int[] arr) {
int max = getMaxValue(arr);
// 对每个位数进行计数排序
for (int exp = 1; max / exp > 0; exp *= 10) {
countingSort(arr, exp);
}
}
public static void countingSort(int[] arr, int exp) {
int n = arr.length;
int[] output = new int[n];
int[] count = new int[10];
// 统计每个数字的出现次数
for (int i = 0; i < n; i++) {
int digit = (arr[i] / exp) % 10;
count[digit]++;
}
// 计算累加次数,确定排序后的位置
for (int i = 1; i < 10; i++) {
count[i] += count[i - 1];
}
// 从后向前遍历原数组,并将元素放入正确的位置
for (int i = n - 1; i >= 0; i--) {
int digit = (arr[i] / exp) % 10;
output[count[digit] - 1] = arr[i];
count[digit]--;
}
// 将排序好的数组拷贝回原数组
for (int i = 0; i < n; i++) {
arr[i] = output[i];
}
}
public static int getMaxValue(int[] arr) {
int max = arr[0];
for (int i = 1; i < arr.length; i++) {
if (arr[i] > max) {
max = arr[i];
}
}
return max;
}
}