蓝桥杯2011 模拟 java 高职

模拟 java 高职

(本试题来源于网上,下载时没有答案,基本都是自己做的答案,才初学浅,有不足的地方,还请及时告知!网名:叫我雷锋 QQ1345523590)

注意:

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

说明:

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

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

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

 

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

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

public class MyTest

{

    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-1==end)System.exit(0);)

 

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

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

    a = a ^ b;

    b = _________;  叫我雷锋作答(b^a)

    a = _________;  叫我雷锋作答(a^b)

 

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

 

许多人都曾经玩过“拍七”游戏。规则是:大家依次从1开始顺序数数,数到含有7或7的倍数的要拍手或其它规定的方式表示越过(比如: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%100==7)

 

1.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=_____________________;

        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;    

}

叫我雷锋作答:{{31,28,31,30,31,30,31,31,30,31,30,30,31},{31,29,31,30,31,30,31,31,30,31,30,30,31}}

 

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==_____________)叫我雷锋作答:j*j

 System.out.print(i + " ");

            }

        }

       

        System.out.println();

    }

1.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);

    }

 

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

 

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

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

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

public static voidreverse(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;

    }

}

 

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

叫我雷锋作答:

packagegaozhi;

 

importjava.util.Scanner;

 

public class Ti8 {

 

   /**

    * 从键盘输入一个整数(1~20则以该数字为矩阵的大小,把1,2,3…n*n的数字按照顺时针螺旋的形式填入其中。例如:输入数字2,则程序输出:

    * 1 24 3 输入数字3,则程序输出: 1 2 3 8 9 4 7 6 5输入数字4则程序输出: 1 2 3 4 12 13 14 5

    * 1116 15 6 10 9 8 7

    */

   public static void fa() {

      Scanner s = new Scanner(System.in);

      int n = s.nextInt();

      int a[][] =new int[n][n];

      int count = 1;

 

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

 

        for (int j = k; j < n - k; j++) {

           a[k][j] = count;

           count++;

        }

        for (int j = k + 1; j < n  -k; j++) {

           a[j][n - k -1] = count;

           count++;

        }

 

        for (int j = n-2-k; j >=k; j--) {

           a[n - 1 - k][j] = count;

           count++;

        }

       

       

        for (int i = n - 2 - k; i > k; i--) {

           a[i][k] = count;

           count++;

        }

       

       

      }

 

      for (int i = 0; i < a.length; i++) {

        for (int j = 0; j < a.length; j++) {

           if (a[i][j] < 10) {

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

           } else {

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

           }

        }

        System.out.println();

      }

   }

 

   public static void main(String[] args) {

      // TODOAuto-generated method stub

 

      Ti8.fa();

 

   }

 

}

 

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

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

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

例如:

用户输入了:1949-10-2

程序输出:1

用户输入了:1949-11-1

程序输出:31

叫我雷锋作答:

packagegaozhi;

 

importjava.text.ParseException;

import java.text.SimpleDateFormat;

importjava.util.Date;

importjava.util.Scanner;

 

public class Ti9 {

 

   /**

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

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

      例如:

      用户输入了:1949-10-2

      程序输出:1

      用户输入了:1949-11-1

      程序输出:31

    * @throws ParseException

    */

   public static void main(String[] args)throws ParseException {

      // TODOAuto-generated method stub

      Scanner s=new Scanner(System.in);

      String ss=s.nextLine();

  

      String ds1 = "1949-10-1";

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

      Date d1 = df.parse(ds1);

      long x1=d1.getTime();

      //上面三行是设置系统为指定的默认时间

      String ds2 = ss;

      SimpleDateFormat d2 = new SimpleDateFormat("yyyy-M-d");

      Date dd2 = df.parse(ds2);

      long x2=dd2.getTime();

      //获取日期差然后算天数就可以了!)

     

      System.out.println("距离"+ds1+"还有 "+((x2-x1)/1000/60/60/24)+" ");

     

  

   }

 

}

 

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

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

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

 

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

[82962, 75933, 63954,61974]

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

本题答案来自于网上:

importjava.util.ArrayList;

importjava.util.Arrays;

importjava.util.List;

public classMyTest {

   // 保存查找到的环

   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(intc=0;c<=b;c++){

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

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

                                             inttemp = 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(inti=0;i<list.size();i++){

                        inttemp = 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(newString(tempCharArray));

          sb.reverse();

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

                 sb.append('0');

          }

          returnInteger.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(newString(tempCharArray));

   }

   /*

    * 根据某个数找环

    */

   static List<Integer> findRing(int number){

          List<Integer> list = newArrayList<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,intnumber){

          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;

   }

}

 

 

1.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

程序输出:成功

叫我雷锋作答:

public static void main(String[] args) {

      // TODOAuto-generated method stub

        Scanner s=new Scanner(System.in);

        long ss=s.nextLong();

        String s1=ss+"";

        //奇数求和

        int sj=0;

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

          

           sj=sj+(int)s1.charAt(i)-48;

          

           System.out.print(sj+" ");

         }

        System.out.println("奇数的和为:"+sj);

        //偶数求和

         int sl=0;

         

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

          

           int k=2*((int)s1.charAt(i)-48);

          

           if(k>9){

                 k=k-9;

           }

           sl=sl+k;

           System.out.print(sl+" ");

        }

        System.out.println(" 偶数的和为:"+sl);

       

        System.out.println("奇数和偶数的和为:"+(sl+sj));

       

        if((sl+sj)%10==0){

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

        }else{

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

        }

       

   }

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值