2011年全国软件大赛模拟题及参考答案(Java高职组)

简介:

2011年全国软件大赛模拟题及参考答案(Java高职组)


不是官方的答案,如有不妥,请指出。

2011 模拟 java 高职

注意:

本套模拟题主要模拟命题形式与考核范围。真实竞赛题的数量、难度可能与此套模拟题有差异。

说明:

本试卷包含两种题型:“代码填空”与“程序设计”。

填空题要求参赛选手在弄清给定代码工作原理的基础上填写缺失的部分,使得程序逻辑正确、完整。所填写的代码不多于一条语句(即不能出现分号)。

编程题要求选手设计的程序对于给定的输入能给出正确的输出结果。注意:在评卷时使用的输入数据与试卷中给出的实例数据可能是不同的。选手的程序必须是通用的,不能只对试卷中给定的数据有效。

 

1.      代码填空(满分3分)

以下程序打印出0~9的数字,请补充缺少的代码。

public class MyTest

{

    public static void f(int begin, int end)

    {

        ___________; if(begin>end) return;

        System.out.println(begin);

        f(begin+1, end);   

    }

    public static void main(String[] args)

    {

        f(0,9);

    }

}

 

2.      代码填空(满分4分)

如果要把两个整型变量a、b的值交换,一般要采用一个中间变量做过渡,但也可以在不借助任何其它变量的情况下完成。试填写缺失的代码。

    a = a ^ b;

    b = _________; b = a ^ b;

    a = _________; a = a ^ b;

 

3.      代码填空(满分3分)

 

许多人都曾经玩过“拍七”游戏。规则是:大家依次从1开始顺序数数,数到含有7或7的倍数的要拍手或其它规定的方式表示越过(比如:7,14,17等都不能数出),下一人继续数下面的数字。违反规则者受罚。下面的程序模拟这个过程,拍7的情况输出“*”,请完善之。

    for(int i=1; i<100; i++)

    {

        if(i % 7 == 0)

            printf("*/n");

        else if(___________________) i%10 == 7 || i/10==7

            printf("*/n"); 

        else

            printf("%d/n", i);

    }

 

 

4.      代码填空(满分5分)

下面的静态方法的目的是求出某个日期是该年度的第几天。试完善之。

如果传入:year=1980,month=1, day=1

则返回 1

如果传入:year=1980,month=2, day=1

则返回 32

public static int getDayOfYear(int year, int month, int day)

{

        int [][]days=_____________________;{{0,31,28,31,30,31,30,31,31,30,31,30,31},{0,31,29,31,30,31,30,31,31,30,31,30}}

        int flag =(year%4==0 && year%100!=0) || year%400 == 0 ? 1 : 0;

        int sum = day ;

        for(int i=0;i<month;i++)    {

            sum += days[flag][i];

        }      

        return sum;    

}

 

5.      代码填空(满分2分)

下列方法的目的是,找出1~n之间所有的平方数。试补全缺失的代码。

当n=10时,输出结果是:

1 4 9

当n=100时,输出结果是:

1 4 9 16 25 36 49 64 81

 

    public static void showSqure(int n)

    {

        for(int i=0; i<n; i++)

        {

            for(int j=1; j<=i; j++)

            {

                if(i==_____________) System.out.print(i + " "); j*j

            }

        }

       

        System.out.println();

    }

6.      代码填空(满分9分)

(a+b)的n次幂的展开式中各项的系数很有规律,对于n=2,3,4时分别是:1 2 1, 1 3 3 1,1 4 6 4 1。这些系数构成了著名的杨辉三角形:

                 1

               1   1

              1  2  1

            1  3   3   1

          1  4   6   4   1

        1  5  10  10   5   1

 

下列的程序给出了计算第m层的第n个系数的计算方法,试完善之(m,n都从0算起)。

    public static int f(int m, int n)

    {

        if(m==0) return 1;

        if(n==0 || n==m) return 1;

        return __________________________; f(m-1,n-1)+f(m-1,n)

    }

 

7.      代码填空(满分4分)

 

下面的代码将数组中的元素的位置颠倒过来:

比如:原来的元素是 [1,2,3]

则颠倒后变为:[3,2,1]

public static void reverse(int[] arrs)

{

       

for (int i = 0, j = arrs.length - 1; i <_________ ; i++, j--) arrs.length/2

{

        int temp = arrs[i];

        arrs[i] = arrs[j];

        arrs[j] = temp;

    }

}

 

8.      程序设计(满分15分)

从键盘输入一个整数(1~20)

则以该数字为矩阵的大小,把1,2,3…n*n 的数字按照顺时针螺旋的形式填入其中。例如:

输入数字2,则程序输出:

1 2

4 3

输入数字3,则程序输出:

1 2 3

8 9 4

7 6 5

输入数字4, 则程序输出:

1  2   3   4

12  13  14  5

11  16  15  6

10   9  8   7

 

import java.util.Scanner;

public class MyTest {

    public static void main(String[] args)

    {

       Scanner in = new Scanner(System.in);

       int n = in.nextInt();

       int value[][] = new int[n][n];

      

       int direction = 1; // 1向右,-1向左,2向上,-2向下

       int row=0;

       int col=0;

       for(int i=0;i<n*n;i++){

           if(value[row][col]==0){

              value[row][col]=i+1;

              if(direction==1){ // 向右

                  if(col+1<n && value[row][col+1]==0){

                     col++;

                  }else{

                     direction=-2;

                     row++;

                  }

              } // 向下

              else if(direction==-2){

                  if(row+1<n && value[row+1][col]==0){

                     row++;

                  }else{

                     direction=-1;

                     col--;

                  }

              }

              else if(direction==-1){

                  if(col-1>=0 && value[row][col-1]==0){

                     col--;

                  }else{

                     direction=2;

                     row--;

                  }

              }

              else{

                  if(row-1>=0 && value[row-1][col]==0){

                     row--;

                  }else{

                     direction=1;

                     col++;

                  }

              }

           }

       }

       for(int i=0;i<n;i++){

           for(int j=0;j<n;j++){

              if(j == 0)

                  System.out.print(value[i][j]);

              else{

                  System.out.print(" "+value[i][j]);

              }

           }

           System.out.println();             

       }

    }

}

 

9.      程序设计(满分9分)

从键盘输入一个日期,格式为yyyy-M-d

要求计算该日期与1949年10月1日距离多少天

例如:

用户输入了:1949-10-2

程序输出:1

用户输入了:1949-11-1

程序输出:31

import java.text.DateFormat;

import java.text.SimpleDateFormat;

import java.util.Date;

import java.util.Scanner;

public class MyTest {

    public static void main(String[] args)

    {

       Scanner in = new Scanner(System.in);

       String date = in.next();

       DateFormat df = new SimpleDateFormat("yyyy-M-d");

       String oldDate = "1949-10-1";

       try{

           Date d = df.parse(date);

           Date d2 = df.parse(oldDate);

           System.out.println((d.getTime()-d2.getTime())/(24*3600*1000));

       }catch(Exception e){

           System.out.println("輸入的不是有效日期");

       }

    }  

}

 

 

10. 程序设计(满分20分)

任意一个5位数,比如:34256,把它的各位数字打乱,重新排列,可以得到一个最大的数:65432,一个最小的数23456。求这两个数字的差,得:41976,把这个数字再次重复上述过程(如果不足5位,则前边补0)。如此往复,数字会落入某个循环圈(称为数字黑洞)。

比如,刚才的数字会落入:[82962, 75933, 63954, 61974] 这个循环圈。

 

请编写程序,找到5位数所有可能的循环圈,并输出,每个循环圈占1行。其中5位数全都相同则循环圈为 [0],这个可以不考虑。循环圈的输出格式仿照:

[82962, 75933, 63954, 61974]

其中数字的先后顺序可以不考虑。

import java.util.ArrayList;

import java.util.Arrays;

import java.util.List;

 

public class MyTest {

    // 保存查找到的环

    static List<List<Integer>> allList = new ArrayList<List<Integer>>();

    public static void main(String[] args)

    {

          

           // 遍历所有的数字

           for(int a=0;a<=9;a++){

                  for(int b=0;b<=a;b++){

                         for(int c=0;c<=b;c++){

                                for(int d=0;d<=c;d++){

                                       for(int e=0;e<=d;e++){

                                              int temp = a*10000+b*1000+c*100+d*10+e;

                                              List<Integer> list = findRing(temp);

                                              if(list!=null){

                                                     allList.add(list);

                                              }

                                       }

                                }

                         }

                  }

           }

           // 输出结果

           for(List<Integer> list:allList){

                  System.out.print("[");

                  for(int i=0;i<list.size();i++){

                         int temp = list.get(i).intValue();

                         System.out.print(temp);

                         if(i!=list.size()-1)

                                System.out.print(",");

                  }

                  System.out.print("]");

                  System.out.println();

           }

    }

    /*

     * 得到最大数,根据32321得到最大数是33221

     */

    static int getMax(int number){

           String temp = String.valueOf(number);

           char tempCharArray[] = temp.toCharArray();

           Arrays.sort(tempCharArray);

           StringBuffer sb = new StringBuffer(new String(tempCharArray));

           sb.reverse();

           for(int i=0;i<5-sb.length();i++){

                  sb.append('0');

           }

           return Integer.parseInt(sb.toString());

    }

    /*

     * 得到最小数,根据32321得到最小数是12233

     */

    static int getMin(int number){

           String temp = String.valueOf(number);

           char tempCharArray[] = temp.toCharArray();

           Arrays.sort(tempCharArray);

           return Integer.parseInt(new String(tempCharArray));

    }

    /*

     * 根据某个数找环

     */

    static List<Integer> findRing(int number){

           List<Integer> list = new ArrayList<Integer>();

           int temp=number;

           while(true){

                  temp = getNext(temp);

                  // 一定存在于环中

                  if(temp==0 || exists(temp)){

                         return null;

                  }

                  int index = find(list,temp);

                  if(index!=-1){

                         return list.subList(index,list.size());

                  }else{

                         list.add(temp);

                  }

           }

    }

    /*

     * 得到最大值-最小值

     */

    static int getNext(int number){

           return getMax(number)-getMin(number);

    }

    /*

     * 查找某个数字是否在某个链表中

     */

    static int find(List<Integer> list,int number){

           int index = -1;

           for(int i=0;i<list.size();i++){

                  if(list.get(i).intValue()==number){

                         index = i;

                         break;

                  }

           }

           return index;

    }

    /*

     * 是否存在于已有的环中

     */

    static boolean exists(int number){

           for(List<Integer> list:allList){

                  if(find(list,number)>-1)

                         return true;

           }

           return false;

    }

}

11. 程序设计(满分 9 分)

当你输入信用卡号码的时候,有没有担心输错了而造成损失呢?其实可以不必这么担心,因为并不是一个随便的信用卡号码都是合法的,它必须通过Luhn算法来验证通过。

该校验的过程:

1、从卡号最后一位数字开始,逆向将奇数位(1、3、5等等)相加。

2、从卡号最后一位数字开始,逆向将偶数位数字,先乘以2(如果乘积为两位数,则将其减去9),再求和。

3、将奇数位总和加上偶数位总和,结果应该可以被10整除。

例如,卡号是:5432123456788881

则奇数、偶数位(用红色标出)分布:5432123456788881

奇数位和=35

偶数位乘以2(有些要减去9)的结果:1 6 2 6 1 5 7 7,求和=35。

最后35+35=70 可以被10整除,认定校验通过。

 

请编写一个程序,从键盘输入卡号,然后判断是否校验通过。通过显示:“成功”,否则显示“失败”。

比如,用户输入:356827027232780

程序输出:成功

 

import java.util.Scanner;

 

public class MyTest {

       public static void main(String[] args)

       {

              System.out.println("请输入卡号:");

              Scanner in = new Scanner(System.in);

              String cardNumber = in.next();

              int sum1 = 0;

              // 处理奇数位

              for(int i=cardNumber.length()-1;i>=0;i=i-2){

                     sum1 += cardNumber.charAt(i)-'0';

              }

              int sum2 = 0;

              // 处理偶数位

              for(int i=cardNumber.length()-2;i>=0;i=i-2){

                     int temp = (cardNumber.charAt(i)-'0')*2;

                     if(temp>9){

                            temp = temp - 9;

                     }

                     sum2 += temp;

              }

              if((sum1+sum2)%10==0){

                     System.out.println("成功");

              }else{

                     System.out.println("失败");

              }

       }

}


相关文章
|
18天前
|
缓存 算法 Java
Java 实现的局域网管控软件的性能调优
局域网管控软件在企业网络管理中至关重要,但随着网络规模扩大和功能需求增加,其性能可能受影响。文章分析了数据处理效率低下、网络通信延迟和资源占用过高等性能瓶颈,并提出了使用缓存、优化算法、NIO库及合理管理线程池等调优措施,最终通过性能测试验证了优化效果,显著提升了软件性能。
30 1
|
4月前
|
JavaScript 前端开发 Java
Java入门软件及基础语法
**摘要:** - **IDEA:** IntelliJ IDEA,顶级Java开发环境,支持Java,JS,JQuery,Ajax调试. - **JDK:** Java开发包含编译器`javac`,JVM,辅助运行Java程序,核心含JRE,tools.jar,rt.jar. - **Git:** 分布式版本控制,管理源代码,支持回溯,协作,远程备份. - **基础语法:** - `if`: 控制流,单/多分支选择,可嵌套,省略单行大括号. - `switch`: 表达式匹配`case`值,执行对应代码,需`break`防穿透.
30 1
|
4月前
|
NoSQL Java Redis
软件开发常见流程之宝塔初始化安装环境配置,Lam前面不选,直接跳商城,在宝塔内点击软件商城,安Mysql5.7,安java项目管理器,安Ngnix最新版,安Redis
软件开发常见流程之宝塔初始化安装环境配置,Lam前面不选,直接跳商城,在宝塔内点击软件商城,安Mysql5.7,安java项目管理器,安Ngnix最新版,安Redis
|
4月前
|
供应链 安全 Java
软件架构一致性问题之通过软件供应链管理提升研发体验如何解决
软件架构一致性问题之通过软件供应链管理提升研发体验如何解决
51 0
|
5月前
|
Java 关系型数据库 开发者
Java编程设计原则:构建稳健、可维护的软件基石
Java编程设计原则:构建稳健、可维护的软件基石
|
5月前
|
Java
2023届蓝桥杯大赛软件类国赛Java大学B组 互质 数论
2023届蓝桥杯大赛软件类国赛Java大学B组 互质 数论
36 1
|
5月前
|
存储 前端开发 算法
2016届蓝桥杯大赛软件类国赛Java大学B组 反幻方 暴力搜索
2016届蓝桥杯大赛软件类国赛Java大学B组 反幻方 暴力搜索
28 0
|
11天前
|
监控 安全 Java
在 Java 中使用线程池监控以及动态调整线程池时需要注意什么?
【10月更文挑战第22天】在进行线程池的监控和动态调整时,要综合考虑多方面的因素,谨慎操作,以确保线程池能够高效、稳定地运行,满足业务的需求。
88 38
|
8天前
|
安全 Java
java 中 i++ 到底是否线程安全?
本文通过实例探讨了 `i++` 在多线程环境下的线程安全性问题。首先,使用 100 个线程分别执行 10000 次 `i++` 操作,发现最终结果小于预期的 1000000,证明 `i++` 是线程不安全的。接着,介绍了两种解决方法:使用 `synchronized` 关键字加锁和使用 `AtomicInteger` 类。其中,`AtomicInteger` 通过 `CAS` 操作实现了高效的线程安全。最后,通过分析字节码和源码,解释了 `i++` 为何线程不安全以及 `AtomicInteger` 如何保证线程安全。
java 中 i++ 到底是否线程安全?
|
2天前
|
存储 设计模式 分布式计算
Java中的多线程编程:并发与并行的深度解析####
在当今软件开发领域,多线程编程已成为提升应用性能、响应速度及资源利用率的关键手段之一。本文将深入探讨Java平台上的多线程机制,从基础概念到高级应用,全面解析并发与并行编程的核心理念、实现方式及其在实际项目中的应用策略。不同于常规摘要的简洁概述,本文旨在通过详尽的技术剖析,为读者构建一个系统化的多线程知识框架,辅以生动实例,让抽象概念具体化,复杂问题简单化。 ####