【整理】全国软件大赛模拟题及参考答案

发布于:2022-12-08 ⋅ 阅读:(483) ⋅ 点赞:(0)

一、前言

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

二、说明

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

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

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

三、考题

3.1、天空

3.1.1、  代码填空(满分3分)

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

public class Test
{
    public static void f(int begin, int end)
    {
        ___________; 
        System.out.println(begin);
        f(begin+1, end);   
    }
    public static void main(String[] args)
    {
        f(0,9);
    }
}

答案:if(begin>end) return;

3.1.2、  代码填空(满分4分)

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

  a = a ^ b;

    b = _________;

    a = _________; 

答案: b = a ^ b;

            a = a ^ b;

3.1.3、 代码填空(满分3分)

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

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

    {

        if(i % 7 == 0)

            printf("*/n");

        else if(___________) 

            printf("*/n");

        else

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

    }

答案:i%10 == 7 || i/10==7

3.1.4代码填空(满分5分)

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

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

则返回 1

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

则返回 32

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

{

        int [][]days=_____________________;

        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;    

}

答案:{{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}}

3.1.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.println();

    }

答案:System.out.print(i + " "); j*j

3.1.6  代码填空(满分9分)

(a+b)n次幂的展开式中各项的系数很有规律,对于n=234时分别是:1 2 1 1 3 3 11 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个系数的计算方法,试完善之(mn都从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)

3.1.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--)

{

        int temp = arrs[i];

        arrs[i] = arrs[j];

        arrs[j] = temp;

    }

}

答案:arrs.length/2

3.1.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();             
       }
    }
}
 

3.1.9程序设计(满分9分)

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

要求计算该日期与1949101日距离多少天

例如:

用户输入了: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("輸入的不是有效日期");
       }
    }  
}

3.1.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;
    }
}

3.1.10程序设计(满分 9 分)

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

该校验的过程:

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

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("失败");
              }
       }
}

 

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到