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

2011年软件设计大赛C语言组预赛真题答案

2012年03月07日 竞赛 ⁄ 共 1767字 ⁄ 字号 暂无评论

思考:如何更好更快的答题?

1
2
3
4
5
6
7
8
9
10
利息计算
开平方
最小公倍数
求日期差
字符串的轮换
金字塔
中奖计算
程序设计:串的处理
程序设计:画表格
程序设计:5个砝码

利息计算

1
2
3
4
5
/*
参考答案:money * 1.03
也可以是逻辑等价:
money + money * 3 / 100;
*/

开平方

1
2
3
/*
参考答案:n/a
*/

最小公倍数

1
2
3
4
5
6
/*
参考答案:i+=a
或者 i = i + a;
注意:i++
虽然可以得到正确结果,但不符题意(高效运行),不给分。
*/

求日期差

1
2
3
/*
  参考答案:x.month-1
*/

字符串的轮换

1
2
3
4
5
6
7
8
/*
 参考答案:
 空1: len+1     (2分)
 空2: 0         (5分)
 空1:strlen(s) + 1  是一样的
 空2:'\0'  (char)0  NULL 是一样的  
 其它未知的都代入程序试验一下
*/

金字塔

1
2
3
4
5
6
7
/*
参考答案:
空1: h(space+1, x-1)   (6分)
空2: x-i              (3分)
(char)((int)x-i) 当然也是可以的
如不能确定,需要代入程序运行实验
*/

中奖计算

1
2
3
4
5
6
7
/*
  参考答案:
  空1:sa[i+j]          (4分)
  空2:n = j            (8分)
  注意sa[i+j] 的多种表达法:
  *(sa+i+j)
*/

程序设计:串的处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
输出:A
积分:1
 
输入:6a
输出:6_a
积分:1
 
输入:a6
输出:A_6
积分:1
 
输入:this  is     a k47coat
输出:This Is A K_47_coat
积分:5
 
输入:50cat do60     s1t2k30
输出:50_cat Do_60 S_1_t_2_k_30
积分:5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
int main(int argc, char *argv[])
{
    char c;
    int space=1, letter=0, digit=0;
    while ((c=getchar())!=EOF) {
        if (space && isalpha(c))
            putchar(c+'A'-'a');
        else if ((digit && isalpha(c)) || (letter && isdigit(c)) ) {
            putchar('_');  putchar(c);
        } else if (space && isspace(c)) {
        } else putchar(c);
 
        space = isspace(c);  letter = isalpha(c);  digit = isdigit(c);
    }
    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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
输入:
1
a
输出:
+-+
|a|
+-+
积分:1
 
输入:
1
ab,,c,def
输出:
+--++-+---+
|ab||c|def|
+--++-+---+
积分:2
 
 
输入:
3
a
bcd
e
输出:
+---+
|a  |
+---+
|bcd|
+---+
|e  |
+---+
积分:2
 
 
输入:
3
a,,b,c
cat dog,this,,time
that,,,is
输出:
+-------+----+-+----+
|a      |    |b|c   |
+-------+----+-+----+
|cat dog|this| |time|
+-------+----+-+----+
|that   |    | |is  |
+-------+----+-+----+
积分:6
 
 
输入:
4
a
,bb
,,ccc
,,,dddd
输出:
+-+--+---+----+
|a|  |   |    |
+-+--+---+----+
| |bb|   |    |
+-+--+---+----+
| |  |ccc|    |
+-+--+---+----+
| |  |   |dddd|
+-+--+---+----+
积分:6

完整程序如下:

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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#include <stdio.h>
 
#define MAX_LINES 30
#define MAX_COL   40
 
int getColNumber(char s[])
{
    int n=1;
    char *p=s;
    while (*p) {
        if (*p==',') n++;
        p++;
    }
    return n;
}
 
void scanLine(char s[], int a[])
{
    char *p = s;
    int n = 0, i=0;
    while (*p!='\0') {
        if (*p!=',') n++;
        else n=0, i++;
        if (n>a[i]) a[i] = n;
        p++;
    }
}
 
void printLine(char s[], int a[], int col)
{
    char *p = s;
    char word[MAX_COL][100];
    int i=0, j=0, k;
    while (*p!='\0') {
        if (*p!=',') word[i][j++]=*p;
        else {
            word[i][j]='\0';
            i++, j=0;
        }
        p++;
    }
    word[i][j] = '\0';
    putchar('|');
    for (i=0; i<col; i++) {
        printf("%s", word[i]);
        for (j=0; j<a[i]-strlen(word[i]); j++)
            putchar(' ');
        putchar('|');
    }
    printf("\n");
}
 
void printPlusLine(int a[], int col)
{
    int i, j;
    putchar('+');
    for (i=0; i<col; i++) {
        for (j=0; j<a[i]; j++) putchar('-');
        putchar('+');
    }
    printf("\n");
}
 
int main(int argc, char *argv[])
{
    int n, i, col=0;
    int a[MAX_COL];
    char lines[MAX_LINES][200];
 
    for (i=0; i<MAX_COL; i++) a[i] = 0;
 
    scanf("%d", &n); getchar();
    for (i=0; i<n; i++)
        gets(lines[i]), scanLine(lines[i], a);
    for (i=0; i<n; i++)
        if (getColNumber(lines[i])>col) col=getColNumber(lines[i]);
 
    for (i=0; i<n; i++) 
        printPlusLine(a, col), printLine(lines[i], a, col);    
    printPlusLine(a, col);
 
    return 0;
}

程序设计:5个砝码

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
输入:
1
输出:
1
积分:1
 
输入:
121
输出:
81+27+9+3+1
积分:2
 
输入:
20
输出:
27-9+3-1
积分:8
 
 
输入:
80
输出:
81-1
积分:8
 
 
输入:
41
输出:
81-27-9-3-1
积分:8
 
注意:
如果第一个数字前输出了符号,则扣2分(不同用例不重复扣分)
如果数字的顺序不对,则扣除3分(不同用例不重复扣分)
本题分数扣完为止。
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
#include <stdio.h>
#include <math.h>
int main(int argc, char *argv[])
{
    int a[243][5];
    int v[243];
    int i, j, t, n;
    int isFirst=1;
    for (i=0; i<243; i++) {
        t = i;
        for (j=4; j>=0; j--)  {
            a[i][j] = t % 3-1;
            t = t / 3;
        }
    }
 
    for (i=0; i<243; i++)
        v[i] = 81*a[i][4] + 27*a[i][3] + 
		9*a[i][2]+ 3*a[i][1] + 1*a[i][0];
 
    scanf("%d", &n);
    for (i=0; i<243; i++)
        if (n==v[i]) {
            for (j=4; j>=0; j--) {
                if (a[i][j]==1)  {
                    if (isFirst)
                        printf("%d", (int)pow(3, j)), isFirst=0;
                    else
                        printf("+%d", (int)pow(3, j));
                }
                if (a[i][j]==-1) printf("-%d", (int)pow(3, j));
            }
            isFirst=1;
            printf("\n");
        }
    return 0;
}

抱歉!评论已关闭.