现在的位置: 首页 > 竞赛 > 正文

2011年软件设计大赛Java语言组预赛答案

2012年03月12日 竞赛 ⁄ 共 296字 ⁄ 字号 暂无评论

Java和C的差别主要体现在:数据的输入、数组的初始化和字符串处理

参看 2011年软件设计大赛Java语言组预赛真题

1
2
3
4
5
6
7
8
9
10
计算蔬菜总价(满分3分)
计算行程 (满分3分)
反转的串 (满分4)
最近距离(满分6)
股票风险 (满分7)
猜数字 (满分9)
基因牛 (满分10)
程序设计:字符串的处理(满分14分)
程序设计:输出“上三角”(满分17分)
程序设计:10名学生参加竞赛(满分27分)

计算蔬菜总价(满分3分)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class GaoZhi1 {
	public static double getTotal(double[] price, double[] weight)
	{
		double x = 0;
		for(int i=0; i<price.length; i++) 
		{
			x += price[i] * weight[i];  // 填空
		}
		return x;
	}
 
    public static void main(String[] args) {
		double[] p = {1.5, 2.4, 1.2, 3.3};
		double[] w = {2,2,3,1.5};
		System.out.println(getTotal(p, w));
    }
}

下面的是相应的C语言的代码,好好比较和Java的差别

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
 
double getTotal(double price[], double weight[], int n)
{
    double x = 0;
	int i = 0;
    for(i=0; i<n; i++) {
        x += price[i] * weight[i]; 
    }
    return x;
}
 
int main(int argc, char *argv[])
{
    double p[] = {1.5, 2.4, 1.2, 3.3};
    double w[] = {2,2,3,1.5};
 
    printf("%.2lf", getTotal(p, w, 4));
 
    return 0;
}

计算行程 (满分3分)

1
2
3
4
5
6
7
8
9
10
11
12
public class GaoZhi2
{
	public static double getDistance(int begin, int end, double d)
	{
		return (end-begin) * Math.PI * d * d/ d / 1000;   // 填空
	}
 
	public static void main(String[] args)
	{
		System.out.println(getDistance(100,200,1));
	}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
 
#define PI 3.142
double getDistance(int begin, int end, double d)
{
    return (end-begin) * PI * d * d/ d / 1000;
}
 
int main(int argc, char *argv[])
{
    printf("%.2lf", getDistance(100,200,1));
    return 0;
}

反转的串 (满分4分)

1
2
3
4
5
6
7
8
9
10
11
12
public class GaoZhi3
{		
	public static void main(String[] args)
	{
		String s = "1234567";		
		String s2 = "";
		for(int i=0; i<s.length(); i++)  {
			s2 = s.charAt(i) + s2; // 填空
		}
		System.out.println(s2);		
	}
}

最近距离(满分6分)

1
2
3
4
5
6
7
8
/*
  参考答案:
  空1: Double.MAX_VALUE  (2分)
  空2: r = d             (4分)
 
  对空1, 若填 999999, 1E20 等较大的数字者,可以给1分
 
*/

股票风险 (满分7分)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class GaoZhi5
{
	public static void main(String[] args)
	{
		int N = 10000;
		int n = 0;
 
		for(int i=0; i<N; i++)
		{
			double value = 1000.0;	
			for(int k=0; k<100; k++)
			{
				if(Math.random() > 0.5)  // 填空1
					value = value * 1.1;
				else
					value = value * 0.9;
			}
			if(value>1000) n++; // 填空2
		}		
		System.out.println(1.0*n/N);
	}
}

在C语言中,rand() 默认返回[1, RAND_MAX] 中的整数,而Java中的 Math.random() 返回 [0, 1] 之间的一个小数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
#include<stdlib.h>
 
int main(int argc, char *argv[])
{
    int N = 10000;
    int n = 0;
    int i, k;
    double value;
 
    for(i=0; i<N; i++) {
        value = 1000.0;
        for(k=0; k<100; k++) {
            if( (double)rand()/RAND_MAX > 0.5)  
                value = value * 1.1;
            else
                value = value * 0.9;
        }
        if(value>1000) n++; 
    }
 
    printf("%.2lf", (1.0*n/N));
    return 0;
}

猜数字 (满分9分)

1
2
3
4
5
/*
  参考答案:
  空1:v2 = m-1    (4.5分)
  空2:v1 = m+1    (4.5分)
*/

折半查找的源程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/* binsearch: 
find x in v[0] <= v[1] <= ... <= v[n-1] */
int binsearch(int x, int v[], int n)
{
    int low, high, mid;
 
    low = 0;
    high = n - 1;
    while (low <= high) {
        mid = (low+high)/2;
        if (x < v[mid])
            high = mid + 1;
        else if (x > v[mid])
            low = mid + 1;
        else /* found match */
            return mid;
    }
    return -1;  /* no match */
}

基因牛 (满分10分)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
/*
  参考答案:
  空1: null             (3分)
  空2: cow.afterYear()  (7分)
 
        cow.age++  也是正确的
 
  不能确定的代入程序试验
*/
 
import java.util.*;
 
public class GaoZhi7
{
	public static class Cow 
	{
		private int age;
		public Cow afterYear()
		{
			age++;
			return age > 2 ? new Cow() : null;  // 填空1
		}	
 
		public static void showTotalCowNum(int n)
		{
			List<Cow> list = new ArrayList<Cow>();
			list.add(new Cow());
 
			for (int i = 0; i < n; i++)
			{
				int cowCount = list.size();
				for (int j = 0; j < cowCount; j++)
				{
					Cow cow = list.get(j).afterYear(); 
					if (cow != null)
					{
						cow.afterYear(); // 填空2
						list.add(cow);
					}
				}
			}
			System.out.println(n + "年后,共有:" + list.size());		
		}
	}		
 
	public static void main(String[] args)
	{
		Cow.showTotalCowNum(7);
	}
}

程序设计:字符串的处理(满分14分)

1
 
1
 

程序设计:输出“上三角”(满分17分)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <stdio.h>
int main(int argc, char *argv[])
{
    int n, t, k=1, i, j, xn, x, dir=0;
    int a[20][20];
    scanf("%d", &n);
    t = (n+1)*n/2;
    i = 0, j = 0;
    x=1; xn = n;
    while (k<=t) {
        a[i][j]=k++;
        if (dir==0) {
            j++;
        } else if (dir==1) {
            i++; j--;
        } else {
            i--;
        }
        x++;
        if (x==xn) {
            x=0; xn--;
            dir = (dir + 1)%3;
        }
    }
    for (i=0; i<n; i++) {
        for (j=0; j<=n-1-i; j++)
            printf("%4d", a[i][j]);
        printf("\n");
    }
    return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
 import java.util.Scanner;
 
public class GaoZhi9 {
    public static void main(String[] args) {
        int n, t, k=1, i, j, xn, x, dir=0;
        int[][] a = new int[20][20];
        Scanner cin = new Scanner(System.in);
        n = cin.nextInt();
        t = (n+1)*n/2;
        i = 0; j = 0;
        x=1; xn = n;
        while (k<=t) {
            a[i][j]=k++;
            if (dir==0) {
                j++;
            } else if (dir==1) {
                i++; j--;
            } else {
                i--;
            }
            x++;
            if (x==xn) {
                x=0; xn--;
                dir = (dir + 1)%3;
            }
        }
        for (i=0; i<n; i++) {
            for (j=0; j<=n-1-i; j++)
                    System.out.printf("%4d", a[i][j]);
            System.out.println();
        }
    }
}

程序设计:10名学生参加竞赛(满分27分)

本题使用穷举法。 每位同学只有两种选择:参加或者不参加。10位同学进行排列,总共就有 2^10=1024种可能。
每种可能对应于一个数组 a,a[0]代表'A',a[1]代表'B',a[2]代表'C',依此类推,a[9]代表'J'。

编写函数 is_ok,根据列出的条件进行筛选,通过所有条件后,函数返回值为1。

函数 print_result 根据数组的内容输出对应的字符。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <stdio.h>
 
int is_ok(int a[])
{
    if (a[0] && !a[1]) return 0;
    if (!a[2] && a[3]) return 0;
    if (a[0] && a[2]) return 0;
    if (a[1]+a[3]!=1) return 0;
    if (a[3]+a[4]+a[5]+a[6]+a[7]<2) return 0;
    if (a[2]+a[6]==1) return 0;
    if (a[2]+a[4]+a[6]+a[8]>2) return 0;
    if (a[4] && a[5]+a[6]<2) return 0;
    if (a[5] && a[6]+a[7]>0) return 0;
    if (a[8]+a[9]==0 && !a[7]) return 0;
    return 1;
}
 
int print_result(int a[])
{
    int i;
    for (i=0; i<10; i++)
        if (a[i]) printf("%2c", 'A'+i);
    printf("\n");
}
 
int main(int argc, char *argv[])
{
    int a[10];
    int i, j, t;
    for (i=0; i<1024; i++) {
        t = i;
        for (j=9; j>=0; j--) {
            a[j] = t % 2; t = t / 2;
        }
        if (is_ok(a)) print_result(a);        
    }
    return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public class GaoZhi10 {
    public static int is_ok(int a[]) {
        if (a[0] == 1 && a[1] == 0) return 0;
        if (a[2] == 0 && a[3] == 1) return 0;        
        if (a[0] == 1 && a[2] == 1) return 0;        
        if (a[1] + a[3] != 1) return 0;
        if (a[3] + a[4] + a[5] + a[6] + a[7] < 2) return 0;        
        if (a[2] + a[6] == 1) return 0;
        if (a[2] + a[4] + a[6] + a[8] > 2) return 0;
        if (a[4] == 1 && a[5] + a[6] < 2) return 0;
        if (a[5] == 1 && a[6] + a[7] > 0) return 0;
        if (a[8] + a[9] == 0 && a[7] == 0) return 0;        
        return 1;
    }
 
    public static void print_result(int[] a) {
        int i;
        for (i = 0; i < 10; i++) 
            if (a[i] == 1) System.out.printf("%2c", 'A' + i);        
        System.out.println();
    }
 
    public static void main(String[] args) {
        int[] a = new int[10];
        int i, j, t;
        for (i = 0; i < 1024; i++) {
            t = i;
            for (j = 9; j >= 0; j--) {
                a[j] = t % 2; t = t / 2;
            }
            if (is_ok(a) == 1) print_result(a);            
        }
    }
}

抱歉!评论已关闭.