气死我了,写一半电脑关机了……
BASIC-16
昨天的思路大体没错,但是为了好理解我又重写了一遍
因为昨天的很繁琐所以把判断素数的函数单独拉出来了
整体思路大概就是:按要求输出等式前半部分,然后把本来就是素数的分类直接输出本身,不是素数的就从2开始除,能够整除就输出,然后取商继续除,直到商不能继续除(判断商为素数)
需要注意的是要把剩余的最后一个商输出,记得乘号
import java.util.Scanner;
public class Main {
public static int isPrime(int n, int arr[]) {
int i;
int flag = 0;
for (i = 0; i < arr.length; i++) {
if (arr[i] == n) {
flag = 1;
break;
}
}
if (flag == 1) {
return 1;
} else {
return 0;
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner = new Scanner(System.in);
int a = scanner.nextInt();
int b = scanner.nextInt();
int arr[] = new int[b];
int i, j, k = 0;
for (i = 2; i <= b; i++) {
int flag = 0;
for (j = 2; j <= Math.sqrt(i); j++) {
if (i % j == 0) {
flag = 1;
break;
}
}
if (flag == 0) {
arr[k] = i;
k++;
}
}
for (i = a; i <= b; i++) {
int cnt = 0;
System.out.print(i + "=");
if (Main.isPrime(i, arr) == 1) {
System.out.print(i);
} else {
int num = i;
while (Main.isPrime(num, arr) == 0) {
for (j = 2; j <= Math.sqrt(num); j++) {
if (num % j == 0) {
if (cnt == 0) {
System.out.print(j);
} else {
System.out.print("*" + j);
}
cnt++;
break;
}
}
num /= j;
}
System.out.print("*" + num);
}
System.out.println();
}
}
}
2021.04.12
突然看不懂自己写了啥……
就又写了一遍,这个比较好理解
import java.util.Scanner;
public class Main {
public static int isPrime(int n) {
int i;
int flag = 1;
for (i = 2; i <= Math.sqrt(n); i++) {
if (n % i == 0) {
flag = 0;
break;
}
}
if (flag == 1) {
return 1;
} else {
return 0;
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner = new Scanner(System.in);
int a = scanner.nextInt();
int b = scanner.nextInt();
int i, j;
for (i = a; i <= b; i++) {
if (Main.isPrime(i) == 1) {
System.out.println(i + "=" + i);
} else {
System.out.print(i + "=");
int num = i;
int cnt = 0;
for (j = 2; j <= Math.sqrt(i); j++) {
if (num % j == 0) {
if (cnt == 0) {
System.out.print(j);
} else {
System.out.print("*" + j);
}
num = num / j;
// System.out.println("-----" + num);
cnt++;
if (Main.isPrime(num) == 1) {
System.out.print("*" + num);
break;
} else {
j = 1;
}
}
}
System.out.println();
}
}
}
}
BASIC-17
矩阵乘法
单独把0次和1次挑出来了(1不挑也可)
遇到两个坑(其实是粗心)
- 存储矩阵相乘结果的矩阵没有初始化
- 幂运算需要循环m次相乘,但是每次相乘都是原矩阵×原矩阵,导致样例过了但是只要次数不是2就是错的,需要再用临时矩阵存放每乘一次之后的结果,下次相乘则用临时矩阵乘原矩阵
记得幂次循环的时候要先-1(这个测试一下就找到Bug了)
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int m = scanner.nextInt();
long arr[][] = new long[n][n];
long num[][] = new long[n][n];
int i, j, k;
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
arr[i][j] = scanner.nextInt();
num[i][j] = arr[i][j];
}
}
if (m == 0) {
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
if (i == j) {
System.out.print("1 ");
} else {
System.out.print("0 ");
}
}
System.out.println();
}
} else if (m == 1) {
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
System.out.print(arr[i][j] + " ");
}
System.out.println();
}
} else {
long ans[][] = new long[n][n];
m = m - 1;
while (m-- != 0) {
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
ans[i][j] = 0;
for (k = 0; k < n; k++) {
ans[i][j] += num[i][k] * arr[k][j];
}
}
}
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
num[i][j] = ans[i][j];
}
}
}
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
System.out.print(ans[i][j] + " ");
}
System.out.println();
}
}
}
}