2011年全国软件大赛模拟题及参考答案(Java高职组)
2011年全國(guó)軟件大賽模擬題及參考答案(Java高職組)
不是官方的答案,如有不妥,請(qǐng)指出。
2011?模擬?java?高職
注意:
本套模擬題主要模擬命題形式與考核范圍。真實(shí)競(jìng)賽題的數(shù)量、難度可能與此套模擬題有差異。
說(shuō)明:
本試卷包含兩種題型:“代碼填空”與“程序設(shè)計(jì)”。
填空題要求參賽選手在弄清給定代碼工作原理的基礎(chǔ)上填寫缺失的部分,使得程序邏輯正確、完整。所填寫的代碼不多于一條語(yǔ)句(即不能出現(xiàn)分號(hào))。
編程題要求選手設(shè)計(jì)的程序?qū)τ诮o定的輸入能給出正確的輸出結(jié)果。注意:在評(píng)卷時(shí)使用的輸入數(shù)據(jù)與試卷中給出的實(shí)例數(shù)據(jù)可能是不同的。選手的程序必須是通用的,不能只對(duì)試卷中給定的數(shù)據(jù)有效。
?
1.??????代碼填空(滿分3分)
以下程序打印出0~9的數(shù)字,請(qǐng)補(bǔ)充缺少的代碼。
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分)
如果要把兩個(gè)整型變量a、b的值交換,一般要采用一個(gè)中間變量做過(guò)渡,但也可以在不借助任何其它變量的情況下完成。試填寫缺失的代碼。
????a = a ^ b;
????b = _________;?b = a ^ b;
????a = _________;?a = a ^ b;
?
3.??????代碼填空(滿分3分)
?
許多人都曾經(jīng)玩過(guò)“拍七”游戲。規(guī)則是:大家依次從1開始順序數(shù)數(shù),數(shù)到含有7或7的倍數(shù)的要拍手或其它規(guī)定的方式表示越過(guò)(比如:7,14,17等都不能數(shù)出),下一人繼續(xù)數(shù)下面的數(shù)字。違反規(guī)則者受罰。下面的程序模擬這個(gè)過(guò)程,拍7的情況輸出“*”,請(qǐng)完善之。
????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分)
下面的靜態(tài)方法的目的是求出某個(gè)日期是該年度的第幾天。試完善之。
如果傳入: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之間所有的平方數(shù)。試補(bǔ)全缺失的代碼。
當(dāng)n=10時(shí),輸出結(jié)果是:
1 4 9
當(dāng)n=100時(shí),輸出結(jié)果是:
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次冪的展開式中各項(xiàng)的系數(shù)很有規(guī)律,對(duì)于n=2,3,4時(shí)分別是:1 2 1,?1 3 3 1,1 4 6 4 1。這些系數(shù)構(gòu)成了著名的楊輝三角形:
?????????????????1
???????????????1???1
??????????????1??2??1
????????????1??3???3???1
??????????1??4???6???4???1
????????1??5??10??10???5???1
?
下列的程序給出了計(jì)算第m層的第n個(gè)系數(shù)的計(jì)算方法,試完善之(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分)
?
下面的代碼將數(shù)組中的元素的位置顛倒過(guò)來(lái):
比如:原來(lái)的元素是?[1,2,3]
則顛倒后變?yōu)?#xff1a;[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.??????程序設(shè)計(jì)(滿分15分)
從鍵盤輸入一個(gè)整數(shù)(1~20)
則以該數(shù)字為矩陣的大小,把1,2,3…n*n?的數(shù)字按照順時(shí)針螺旋的形式填入其中。例如:
輸入數(shù)字2,則程序輸出:
1 2
4 3
輸入數(shù)字3,則程序輸出:
1 2 3
8 9 4
7 6 5
輸入數(shù)字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.??????程序設(shè)計(jì)(滿分9分)
從鍵盤輸入一個(gè)日期,格式為yyyy-M-d
要求計(jì)算該日期與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.?程序設(shè)計(jì)(滿分20分)
任意一個(gè)5位數(shù),比如:34256,把它的各位數(shù)字打亂,重新排列,可以得到一個(gè)最大的數(shù):65432,一個(gè)最小的數(shù)23456。求這兩個(gè)數(shù)字的差,得:41976,把這個(gè)數(shù)字再次重復(fù)上述過(guò)程(如果不足5位,則前邊補(bǔ)0)。如此往復(fù),數(shù)字會(huì)落入某個(gè)循環(huán)圈(稱為數(shù)字黑洞)。
比如,剛才的數(shù)字會(huì)落入:[82962, 75933, 63954, 61974]?這個(gè)循環(huán)圈。
?
請(qǐng)編寫程序,找到5位數(shù)所有可能的循環(huán)圈,并輸出,每個(gè)循環(huán)圈占1行。其中5位數(shù)全都相同則循環(huán)圈為?[0],這個(gè)可以不考慮。循環(huán)圈的輸出格式仿照:
[82962, 75933, 63954, 61974]
其中數(shù)字的先后順序可以不考慮。
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
?
public class MyTest {
????//?保存查找到的環(huán)
????static List<List<Integer>> allList = new ArrayList<List<Integer>>();
????public static void main(String[] args)
????{
??????????
???????????//?遍歷所有的數(shù)字
???????????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);
??????????????????????????????????????????????}
???????????????????????????????????????}
????????????????????????????????}
?????????????????????????}
??????????????????}
???????????}
???????????//?輸出結(jié)果
???????????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();
???????????}
????}
????/*
?????*?得到最大數(shù),根據(jù)32321得到最大數(shù)是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());
????}
????/*
?????*?得到最小數(shù),根據(jù)32321得到最小數(shù)是12233
?????*/
????static int getMin(int number){
???????????String temp = String.valueOf(number);
???????????char tempCharArray[] = temp.toCharArray();
???????????Arrays.sort(tempCharArray);
???????????return Integer.parseInt(new String(tempCharArray));
????}
????/*
?????*?根據(jù)某個(gè)數(shù)找環(huán)
?????*/
????static List<Integer> findRing(int number){
???????????List<Integer> list = new ArrayList<Integer>();
???????????int temp=number;
???????????while(true){
??????????????????temp = getNext(temp);
??????????????????//?一定存在于環(huán)中
??????????????????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);
????}
????/*
?????*?查找某個(gè)數(shù)字是否在某個(gè)鏈表中
?????*/
????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;
????}
????/*
?????*?是否存在于已有的環(huán)中
?????*/
????static boolean exists(int number){
???????????for(List<Integer> list:allList){
??????????????????if(find(list,number)>-1)
?????????????????????????return true;
???????????}
???????????return false;
????}
}
11.?程序設(shè)計(jì)(滿分?9?分)
當(dāng)你輸入信用卡號(hào)碼的時(shí)候,有沒(méi)有擔(dān)心輸錯(cuò)了而造成損失呢?其實(shí)可以不必這么擔(dān)心,因?yàn)椴⒉皇且粋€(gè)隨便的信用卡號(hào)碼都是合法的,它必須通過(guò)Luhn算法來(lái)驗(yàn)證通過(guò)。
該校驗(yàn)的過(guò)程:
1、從卡號(hào)最后一位數(shù)字開始,逆向?qū)⑵鏀?shù)位(1、3、5等等)相加。
2、從卡號(hào)最后一位數(shù)字開始,逆向?qū)⑴紨?shù)位數(shù)字,先乘以2(如果乘積為兩位數(shù),則將其減去9),再求和。
3、將奇數(shù)位總和加上偶數(shù)位總和,結(jié)果應(yīng)該可以被10整除。
例如,卡號(hào)是:5432123456788881
則奇數(shù)、偶數(shù)位(用紅色標(biāo)出)分布:5432123456788881
奇數(shù)位和=35
偶數(shù)位乘以2(有些要減去9)的結(jié)果:1 6 2 6 1 5 7 7,求和=35。
最后35+35=70?可以被10整除,認(rèn)定校驗(yàn)通過(guò)。
?
請(qǐng)編寫一個(gè)程序,從鍵盤輸入卡號(hào),然后判斷是否校驗(yàn)通過(guò)。通過(guò)顯示:“成功”,否則顯示“失敗”。
比如,用戶輸入:356827027232780
程序輸出:成功
?
import java.util.Scanner;
?
public class MyTest {
???????public static void main(String[] args)
???????{
??????????????System.out.println("請(qǐng)輸入卡號(hào):");
??????????????Scanner in = new Scanner(System.in);
??????????????String cardNumber = in.next();
??????????????int sum1 = 0;
??????????????//?處理奇數(shù)位
??????????????for(int i=cardNumber.length()-1;i>=0;i=i-2){
?????????????????????sum1 += cardNumber.charAt(i)-'0';
??????????????}
??????????????int sum2 = 0;
??????????????//?處理偶數(shù)位
??????????????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("失敗");
??????????????}
???????}
}
總結(jié)
以上是生活随笔為你收集整理的2011年全国软件大赛模拟题及参考答案(Java高职组)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 2011年全国软件大赛模拟题及参考答案(
- 下一篇: 停止Java线程,小心interrupt