目录
五、试题E:大写(时间限制: 1.0s 内存限制: 512.0MB 本题总分:15 分)
六、试题F:123(时间限制: 5.0s 内存限制: 512.0MB 本题总分:15 分)
七、试题G:和与乘积(时间限制: 1.0s 内存限制: 512.0MB 本题总分:20 分)
八、试题H:巧克力(时间限制: 1.0s 内存限制: 512.0MB 本题总分:20 分)
九、试题I:翻转括号序列(时间限制: 10.0s 内存限制: 768.0MB 本题总分:25 分)
十、试题J:异或三角(时间限制: 5.0s 内存限制: 512.0MB 本题总分:25 分)
一、试题A:整数范围(本题总分:5 分)
01解法一
package national_12_2021;
public class A01_整数范围 {
public static void main(String[] args) {
System.out.println(Integer.parseInt("11111111", 2)); // 255
}
}
二、试题B:纯质数(本题总分:5 分)
02解法一
package national_12_2021;
import java.util.ArrayList;
public class B02_纯质数 {
static int number = 20210605;// 测试的上限
static int map[] = new int[number];
static ArrayList<String> ans = new ArrayList();
static int anscount = 0;
public static void main(String[] args) {
int count = 0;
// 此for循环找出范围内所有的质数
for (int i = 2; i <= number; i++) {
boolean add = true;
for (int j = 2; j * j <= i; j++) {
if (i % j == 0) {
add = false;
continue;
}
}
if (add == true) {
map[count] = i;
count++;
}
}
//System.out.println("wanbi");
// 此for循环对每个质数进行判断
for (int i = 0; i < count; i++) {
String single = String.valueOf(map[i]);
//System.out.print(single+" ");
boolean shi = true;
// 将这个质数转化为字符串后将其的每一个字符转化为数字
flag: for (int j = 0; j < single.length(); j++) {
Integer wei = Integer.valueOf(single.charAt(j) - 48);
// 排除1和0
if (wei == 1 || wei == 0) {
shi = false;
break;
}
// 判断这个位数是不是质数
for (int k = 2; k * k <= wei; k++) {
if (wei % k == 0) {
shi = false;
break flag;
}
}
//System.out.print(wei+" ");
}
// 如果这个质数是纯质数的话,总和+1
if (shi == true) {
System.out.println(single);
ans.add(single);
anscount++;
}
//System.out.println();
}
// 调试时的输出语句
// for (int i = 0; i < count; i++) {
// System.out.print(map[i]+" ");
// }
// System.out.println();
// for (int i = 0; i < ans.size(); i++) {
// System.out.print(ans.get(i)+" ");
// }
System.out.println();
System.out.println(anscount);
}
}
三、试题C:完全日期(本题总分:10 分)
03解法一
package national_12_2021;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
public class C03_完全日期 {
static int anscount = 0;
public static void main(String[] args) throws ParseException {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd");// 指定输入格式
Date data = simpleDateFormat.parse("2001/01/01");// 获取指定日期的Data对象
// System.out.println(data);
Calendar calendar = Calendar.getInstance();
calendar.setTime(data);// 转化为对应的Calendar类的对象,以便利用其内现有的方法
calendar.add(Calendar.DAY_OF_YEAR, 1);// 获取后相差了一天,把它加回去
// System.out.println(calendar.toInstant());
int[] list = new int[10];
ArrayList<Integer> index = new ArrayList();
for (int i = 1; i <= 20; i++) {
index.add(i * i);
}
// 输出一下,看产生的完全平方数对不对
// for (int i = 0; i < index.size(); i++) {
// System.out.print(index.get(i) + " ");
// }
// System.out.println();
for (int i = 1; i <= 7670; i++) {
StringBuilder yearsb = new StringBuilder();
StringBuilder monthsb = new StringBuilder();
StringBuilder daysb = new StringBuilder();
// 太多数据看不过来,调试时将下面这个if打开,筛掉一部分数据
// if(i<100 ||i>7600) {
String datastr = calendar.toInstant().toString();// 将此时calendar储存的日期转化为字符串
// 下面三个for从该字符串中获取年份的字符,
for (int j = 0; j < 4; j++) {
yearsb.append(datastr.charAt(j));
}
for (int j = 5; j < 7; j++) {
monthsb.append(datastr.charAt(j));
}
for (int j = 8; j < 10; j++) {
daysb.append(datastr.charAt(j));
}
// 紧接这的三个for将字符转换为数字
int count = 0;
for (int j = 0; j < yearsb.length(); j++) {
list[count] = Integer.valueOf(yearsb.charAt(j) - 48);
count++;
}
for (int j = 0; j < monthsb.length(); j++) {
list[count] = Integer.valueOf(monthsb.charAt(j) - 48);
count++;
}
for (int j = 0; j < daysb.length(); j++) {
list[count] = Integer.valueOf(daysb.charAt(j) - 48);
count++;
}
// 对所有数字进行累加
int sum = 0;
for (int j = 0; j < count; j++) {
// System.out.print(list[j]+" ");
sum += list[j];
}
// 判断是否在已经建立好的完全平方数表里面
boolean contains = index.contains(sum);
// 是的话计数器+1
if (contains == true) {
// System.out.println(" "+sum);
anscount++;
}
// }
calendar.add(Calendar.DAY_OF_MONTH, 1);
}
System.out.println(anscount);
}
}
四、试题D:最小权值(本题总分:10 分)
04解法一
五、试题E:大写(时间限制: 1.0s 内存限制: 512.0MB 本题总分:15 分)
05解法一
package national_12_2021;
import java.util.Scanner;
public class E05_大写 {
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
String next = cin.next();
String upperCase = next.toUpperCase();
System.out.println(upperCase);
}
}
六、试题F:123(时间限制: 5.0s 内存限制: 512.0MB 本题总分:15 分)
06解法一
七、试题G:和与乘积(时间限制: 1.0s 内存限制: 512.0MB 本题总分:20 分)
07解法一
package national_12_2021;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;
public class G07_和与乘积 {
static int dp[][][] = new int[10002][10002][2];
static int list[] = new int[20002];
static int n;
public static void main(String[] args) throws IOException {
Scanner cin = new Scanner(System.in);
n = cin.nextInt();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in), 1024);
// System.out.println("test1");
String[] split = br.readLine().split(" ");// 读入一整行,在用空格把这些数字分开
for (int i = 1; i <= split.length; i++) {
list[i] = Integer.valueOf(split[i - 1]);// 将字符串类型的数字转化为int类型,并存进数组里面
}
// System.out.println("test2");
// 下面两个for用于初始化dp数组(初始化上文示意图中4个黑色箭头所指的地方)
for (int i = 1; i <= n; i++) {
for (int j = i; j <= n; j++) {
if (i == j) {
dp[i][j][0] = list[i];
dp[i][j][1] = list[i];
}
}
}
for (int i = 1; i <= n; i++) {
for (int j = i + 1; j <= n; j++) {
dp[i][j][0] = dp[i][j - 1][0] + list[j];
dp[i][j][1] = dp[i][j - 1][1] * list[j];
}
}
int ans = n;
for (int i = 1; i <= n; i++) {
for (int j = i + 1; j <= n; j++) {
if (dp[i][j][0] == dp[i][j][1]) {
ans++;
}
}
}
// for (int i = 1; i <= n; i++) {
// for (int j = 1; j <=n; j++) {
// System.out.print("("+dp[i][j][0]+" "+dp[i][j][1]+")");
// }
// System.out.println();
// }
System.out.println(ans);
}
}