T1191,T1142,T1312,T1957
- T1191
- T1142
- T1312
- T1957
T1191
一个笼子里面关了鸡和兔子(鸡有 2 只脚,兔子有 4 只脚,没有残疾的)。已经知道了笼子里面脚的总数 a,问笼子里面至少有多少只动物,至多有多少只动物。
解析:分析知 总数a 是 2 的倍数,鸡兔同笼才有解法 否则 无解
假如 a % 2 == 0,则最大数量 就是全鸡 a / 2,
假如 (temp = a / 2) % 2 == 0,则最小数量 就是全兔 temp / 2,否则最小数量就是 一鸡全兔 (temp - 1) / 2 + 1
package com.java3.ch4;import java.util.Scanner;public class T1191 {public static void main(String[] args) {Scanner scan = new Scanner(System.in);int a = scan.nextInt();int maxAmount = 0;int minAmount = 0;if(a % 2 == 0){int temp = a / 2;maxAmount = temp;if(temp % 2 == 0){minAmount = temp / 2;}else{minAmount = (temp - 1) / 2 + 1;}}System.out.println(minAmount + " " + maxAmount);}
}
20
5 10
T1142
幻方是一个很神奇的N×N 矩阵,它的每行、每列与对角线,加起来的数字和都是相同的。我们可以通过以下方法构建一个幻方。(阶数为奇数)
第一个数字写在第一行的中间
下一个数字,都写在上一个数字的右上方:
- 如果该数字在第一行,则下一个数字写在最后一行,列数为该数字的右一列
- 如果该数字在最后一列,则下一个数字写在第一列,行数为该数字的上一行
- 如果该数字在右上角,或者该数字的右上方已有数字,则下一个数字写在该数字的下方
解析:使用 int型的二维数组来存储这个幻方,已知幻方存储数据时 下一个数字 依赖于 上一个数字插入的行数和列数,并且给出第一次插入数据的行数和列数,构造Recode类来记录上一个数字插入的行数和列数,并通过在插入下一个数字后 修改行数和列数,
package com.java3.ch4;import java.util.Scanner;public class T1142 {public static void main(String[] args) {Scanner scan = new Scanner(System.in);int N = scan.nextInt();int orderOfMatrix = 2*N - 1;int[][] array = new int[orderOfMatrix][orderOfMatrix];Recode r = new Recode();//第一次插入array[0][orderOfMatrix / 2] = 1;r.setRow(0);r.setLine(orderOfMatrix / 2);//插入数据for(int i = 2;i <= (2*N -1) * (2*N -1);i++){writeArray(array,orderOfMatrix,r,i);}//输出数据for(int i = 0; i< orderOfMatrix;i++){for(int j = 0; j< orderOfMatrix;j++){System.out.print(array[i][j] + " ");}System.out.println();}}public static void writeArray(int[][] arr, int orderOfMatrix, Recode r, int values){/*arr:待填充数据的数组orderOfMatrix:矩阵的阶数r:Recode类的实例 其中row,line属性记录上一次插入数值的行数和列数values:当前正准备插入的数值*/int row = r.getRow();int line = r.getLine();//如果该数字在第一行,则下一个数字写在最后一行,列数为该数字的右一列int newRow = (row == 0)?(orderOfMatrix - 1):(row - 1) % orderOfMatrix;//如果该数字在最后一列,则下一个数字写在第一列,行数为该数字的上一行int newLine = (line + 1) % orderOfMatrix;//如果该数字在右上角,或者该数字的右上方已有数字,则下一个数字写在该数字的下方boolean isUpperRight = (row == 0) &&(line == (orderOfMatrix - 1));if(isUpperRight || arr[newRow][newLine] != 0){newRow = (row + 1) % orderOfMatrix;newLine = line;arr[newRow][newLine] = values;}else{arr[newRow][newLine] = values;}r.setRow(newRow);r.setLine(newLine);}
}class Recode{int row;int line;public int getRow() {return row;}public void setRow(int row) {this.row = row;}public int getLine() {return line;}public void setLine(int line) {this.line = line;}
}
3
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
T1312
考试的时候老师最讨厌有人抄袭了。自从有了电子评卷,老师要查找雷同卷,就容易多了,只要将两个人的答案输入计算机,进行逐个字符的比对,把相同的位置都找出来,就一目了然了。
解析:使用 scan.nextLine() 接受数据 去循环长度等于较短字符串的长度 分别比较每个字符是否相同
package com.java3.ch4;import java.util.Scanner;public class T1312 {public static void main(String[] args) {Scanner scan = new Scanner(System.in);String str1 = scan.nextLine();String str2 = scan.nextLine();
// String str1 = "I am suantoujun.";
// String str2 = "I am huayemei.";// System.out.println(str1);
// System.out.println(str2);char[] arrayStr1 = str1.toCharArray();char[] arrayStr2 = str2.toCharArray();int lenStr1 = arrayStr1.length;int lenStr2 = arrayStr2.length;int len = (lenStr1 > lenStr2)?lenStr2:lenStr1;for(int i = 0;i < len;i++){if(arrayStr1[i] == arrayStr2[i]){System.out.print((i + 1) + " ");}}}
}
I am suantoujun.
I am huayemei.
1 2 3 4 5 6 8 9
T1957
输入一行字符,分别统计出其中英文字母、数字、空格和其他字符的个数
解析:找对其对应的 ASCII码值的范围 分别对应即可
package com.java3.ch4;import java.util.Scanner;public class T1957 {public static void main(String[] args) {Scanner scan = new Scanner(System.in);String str = scan.nextLine();char[] array = str.toCharArray();int[] count = new int[4];for(int i = 0;i < array.length;i++){int temp = (int)array[i];//大写字母 65-90 小写字母 97-122if((temp >= 65 && temp <= 90) || (temp >= 97 && temp <= 122)){count[0]++;}else if(temp >= 48 && temp <= 57){//数字0-9:48-57count[1]++;}else if(temp == 32){//空格 32count[2]++;}else{count[3]++;}}for(int i = 0;i < count.length;i++){System.out.print(count[i] + " ");}}
}
aklsjflj123 sadf918u324 asdf91u32oasdf/.';123
23 16 2 4