问题描述
利用字母可以组成一些美丽的图形,下面给出了一个例子:
ABCDEFG
BABCDEF
CBABCDE
DCBABCD
EDCBABC
这是一个5行7列的图形,请找出这个图形的规律,并输出一个n行m列的图形。
输入格式
输入一行,包含两个整数n和m,分别表示你要输出的图形的行数的列数。
输出格式
输出n行,每个m个字符,为你的图形。
样例输入
5 7
样例输出
ABCDEFG
BABCDEF
CBABCDE
DCBABCD
EDCBABC
数据规模与约定
1 <= n, m <= 26。
解析
其实我觉得这道题就是找规律,给出源码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int a = scanner.nextInt(); //表示行
int b = scanner.nextInt(); //表示列
char[] c = new char[b + 1];
for (int i = 0; i < a; i++) {
for (int j = 0; j < b; j++) {
c[j] = (char) ('A' + Math.abs(j - i));
}
System.out.println(c);
}
}
}
Description
给定一个N阶矩阵A,输出A的M次幂(M是非负整数)
例如:
A =
1 2
3 4
A的2次幂
7 10
15 22
Input
第一行是一个正整数N、M(1<=N<=30, 0<=M<=5),表示矩阵A的阶数和要求的幂数
接下来N行,每行N个绝对值不超过10的非负整数,描述矩阵A的值
Output
输出共N行,每行N个整数,表示A的M次幂所对应的矩阵。相邻的数之间用一个空格隔开
Sample Input
2 2
1 2
3 4
Sample Output
7 10
15 22
解析
本题考的是矩阵的乘法,矩阵用二维数组表示,如下:
int[][] array_1 = new int[n][n];
int[][] array_2 = new int[n][n];
这是相称的两个数组
然后此题的重点是矩阵相乘的算法:
//矩阵相乘
for (int a = 1; a < m; a++) {
int[][] array_3 = new int[n][n];
//行
for (int i = 0; i < array_1.length; i++) {
//列
for (int j = 0; j < array_1[i].length; j++) {
sum = 0;
for (int k = 0; k < array_1.length; k++)
sum += array_2[i][k] * array_1[k][j];
array_3[i][j] = sum;
}
}
for (int i = 0; i < array_3.length; i++) {
for (int j = 0; j < array_3.length; j++) {
array_2[i][j] = array_3[i][j];
}
}
}
array_3表示的是临时数组,用以存储两个矩阵的乘积,根据矩阵的乘法可以得出
array_3[i][j] += array_2[i][k] * array_1[k][j];
反复乘m次即可得到最后的结果。
!!!!!!!!!!但是此题到此并未结束,因为题中给出了如下条件:
正整数N、M(1<=N<=30, 0<=M<=5)
m是可以为0的,如果m为0需要我们输出单位矩阵,所以下面的一步操作必不可少:
if (m == 0) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (i == j)
array_2[i][j] = 1;
else
array_2[i][j] = 0;
}
}
}
至此,本题解答完毕,下面给出完整的代码:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
int sum;
int[][] array_1 = new int[n][n];
int[][] array_2 = new int[n][n];
for (int i = 0; i < array_1.length; i++) {
for (int j = 0; j < array_1[i].length; j++) {
array_2[i][j] = array_1[i][j] = sc.nextInt();
}
}
if (m == 0) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (i == j)
array_2[i][j] = 1;
else
array_2[i][j] = 0;
}
}
}
//矩阵相乘
for (int a = 1; a < m; a++) {
int[][] array_3 = new int[n][n];
//行
for (int i = 0; i < array_1.length; i++) {
//列
for (int j = 0; j < array_1[i].length; j++) {
sum = 0;
for (int k = 0; k < array_1.length; k++)
sum += array_2[i][k] * array_1[k][j];
array_3[i][j] = sum;
}
}
for (int i = 0; i < array_3.length; i++) {
for (int j = 0; j < array_3.length; j++) {
array_2[i][j] = array_3[i][j];
}
}
}
//遍历
for (int i = 0; i < array_2.length; i++) {
for (int j = 0; j < array_2[i].length; j++)
System.out.print(array_2[i][j] + " ");
System.out.println();
}
}
}
Tips
这里对二维数组的长度做个小的记录
int[][] arr = new int[3][4]
3表示又3个数组
4表示有每个数组中有四个元素
即数组的长度是3,数组的元素的长度是4
上面这段代码的运行结果是
Description
FJ在沙盘上写了这样一些字符串:
A1 = “A”
A2 = “ABA”
A3 = “ABACABA”
A4 = “ABACABADABACABA”
… …
你能找出其中的规律并写所有的数列AN吗?
Input
仅有一个数:N ≤ 26。
Output
请输出相应的字符串AN,以一个换行符结束。输出中不得含有多余的空格或换行、回车符。
Sample Input
3
Sample Output
ABACABA
源代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
System.out.println(An(n));
}
static StringBuffer An(int n) {
if (n != 1) {
char c = (char) ('A' + n - 1);
return An(n - 1).append(c).append(An(n - 1));
} else {
return new StringBuffer("A");
}
}
}