2022年第四届全国高校计算机能力挑战赛区域赛(java)
第一套试卷
编程的个人解答源码及思路
1.编写程序完成以下功能:输入正整数a的值,若a为偶数,求aa+aaaa+aaaaaa+
直到a个a的累加和;若a为奇数,求a+aaa+aaaaa+直到a个a的累加和。
输入说明:1至9之间的正整数a。
输出说明:符合规律要求的连加算式(包含加数、运算符号和累加和,详见输出样例)
输入样例1:5
输入样例2:6
输出样例1:5+555+55555=56115
输出样例2:66+6666+666666=673398
源码:
1. import java.util.Scanner;
2. public class FirstProblemPreliminary {
3. public static void main(String[] args) {
4. Scanner sc = new Scanner(System.in);
5. int number = Integer.valueOf(sc.nextLine());
6. int finalSum=0;
7. String finalPattern="";
8. if (number%2==0){
9. for(int i=2;i<=number;i+=2){
10. int stepNumber=stepNumber(number,i);
11. finalSum=finalSum+stepNumber;
12. finalPattern=finalPattern.concat(String.valueOf(stepNumber)).concat("+");
13. }
14. }
15. if (number%2==1){
16. for(int i=1;i<=number;i+=2){
17. int stepNumber=stepNumber(number,i);
18. finalSum=finalSum+stepNumber;
19. finalPattern=finalPattern.concat(String.valueOf(stepNumber)).concat("+");
20. }
21. }
22. finalPattern=finalPattern.substring(0,finalPattern.length()-1);
23. finalPattern=finalPattern.concat("=").concat(String.valueOf(finalSum));
24. System.out.println(finalPattern);
25. }
26. static int stepNumber(int number,int times){
27. int sum=0;
28. for(int i=0;iK>Q>J>T>9>8>7>6>5>4>3。比如:6大于5,但是不比4大,6和4不能比较。单牌2属于特殊牌,可以和其他所有普通单牌比较,并且是最大的。
b)对子:即两张牌的点数相同,规则和单牌相似,两个2是特殊对子,可以大于所有的其他对子。注意:对子和单牌不能进行比较。
c)炸弹:3个点数相同的牌。炸弹可以大于任何单张和对子,炸弹之间的比较与单牌和对子不同,只要满足:222>AAA>KKK>QQQ>JJJ>TTT>.…>333的规则的即可。即222是最大的,AAA可以大于KKK,也可以大于333。
编写一个方法实现两手牌的比较:
int compareCards (String firstCards, String secondCards)
参数:firstCards是需要比较的第一手牌,secondCards是需要比较的第二手牌
返回:int型数据,如果firstCards和secondCards一样大,返回0;如果firstCards大于secondCards,返回1;如果firstCards小于secondCards;返回-1;如果firstCards和secondCards无法比较,返回2。
输入说明:要比较的两手牌,中间以空格隔开。每一手牌可能是任何大小的单牌、对子或炸弹。不符合规则的输入情况不需考虑。
输出说明:两手牌的比较结果
输入时两手牌之间用空格隔开。
输入样例1:J T
输入样例2:J 8
输出样例1:1
输出样例2:2
源码:
1. import java.util.HashMap;
2. import java.util.Scanner;
3. public class SecondProblemPreliminary {
4. public static void main(String[] args) {
5. Scanner sc = new Scanner(System.in);
6. String[] strArray = sc.nextLine().split("\\s+");
7. String firstCards = strArray[0];
8. String secondCards = strArray[1];
9. System.out.println(compareCards(firstCards,secondCards));
10. }
11.
12. static int compareCards(String firstCards, String secondCards) {
13. //12=2 21=2 13=-1 31=1 23=-1 32=1
14. int lengthFirstCards = firstCards.length();
15. int lengthSecondCards = secondCards.length();
16. if (lengthFirstCards + lengthSecondCards == 3) {
17. //不能比较(单牌和对子)
18. //12 21
19. return 2;
20. }
21. if ((lengthFirstCards == 3) && (lengthSecondCards < 3)) {
22. //大于(第一手牌是炸弹,第二手牌是单牌或者对子)
23. //31 32
24. return 1;
25. }
26. if ((lengthFirstCards < 3) && (lengthSecondCards == 3)) {
27. //小于(第二手牌是炸弹,第一手牌是单牌或者对子)
28. //13 23
29. return -1;
30. }
31. //同级比较
32. HashMap compareRules = new HashMap<>();
33. String[] singleCardString = {"3", "4", "5", "6", "7", "8", "9", "T", "J", "Q", "K", "A", "2"};
34. int numberSingleCards = singleCardString.length;
35. for (int i = 0; i < numberSingleCards; i++) {
36. compareRules.put(singleCardString[i], i);
37. }
38. //同级比较-炸弹
39. if (lengthFirstCards == 3) {
40. int index1 = compareRules.get(firstCards.substring(0, 1));
41. int index2 = compareRules.get(secondCards.substring(0, 1));
42. //大于
43. if (index1 > index2) return 1;
44. //小于
45. if (index1 < index2) return -1;
46. //等于
47. return 0;
48. } else {
49. //同级比较-单牌或者对子
50. int index1 = compareRules.get(firstCards.substring(0, 1));
51. int index2 = compareRules.get(secondCards.substring(0, 1));
52. int diff = index1 - index2;
53. if (diff == 0)
54. return 0;
55. if (firstCards.substring(0, 1).equalsIgnoreCase("2")) {
56. return 1;
57. }
58.