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("失敗");
??????????????}
???????}
}
總結
以上是生活随笔為你收集整理的2011年全国软件大赛模拟题及参考答案(Java高职组)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2011年全国软件大赛模拟题及参考答案(
- 下一篇: 编程能力强化(4)——模拟SQL语句解析