2019-10-31 10月31日程序设计实验OJ题目记录

Problem A: 输出连续的整数序列 之一

Description

输出指定区间内的所有整数。

Input

输入只有1行,即N,N是一个int类型的数据。

Output

如果N>0,则输出[1,N]区间内的所有整数;如果N =0,则输出0;如果N<0,则输出[N,-1]内的所有整数。

如果输出的整数多于1个,则两两之间用一个空格隔开。

Sample Input

9

Sample Output

1 2 3 4 5 6 7 8 9

AC代码

#include<stdio.h>
 
int main() {
    int n;
    int flag = 0;
    scanf("%d", &n);
 
    if (n == 0) {
        printf("%d", 0);
    } else if (n > 0) {
        for (int i = 1; i <= n; i++) {
            if (flag == 0) {
                printf("%d", i);
                flag = 1;
            } else {
                printf(" %d", i);
            }
        }
    } else if (n < 0) {
        for (int i = n; i <= -1; i++) {
            if (flag == 0) {
                printf("%d", i);
                flag = 1;
            } else {
                printf(" %d", i);
            }
        }
    }
 
    return 0;
}

Problem B: 输出连续的整数序列 之二

Description

输出若干个连续的整数序列。

Input

输入有多行。第一行是N>0,表示后面有N行输入。

之后每行输入包含2个数据P和Q,两者之间用空格隔开,且均在int类型的表示范围内。

Output

输出N个连续的整数序列,序列两两之间用一个空行隔开。

其中第i个序列是在P和Q之间的整数,包括P和Q,且当输出的数据多于1个时,两两之间用一个空格隔开。

Sample Input

3
1 100
10 -10
10 10

Sample Output

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 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100

-10 -9 -8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9 10

10

HINT

当P或Q是int类型的能够表示的最大值或者最小值时,应该如何处理?

AC代码

#include <stdio.h>
 
int main() {
    int z, x, i, N, temp, j;

    scanf("%d", &N);

    for(j = 0; j < N; ++j) {
        scanf("%d%d",&z,&x);
        if(z > x) {
            temp=z;
            z=x;
            x=temp;
        }

        for(i=z; i<x; ++i) {
            printf("%d ", i);
        }
        printf("%d\n", x);

        printf("\n");
    }
    return 0;
}

Problem C: 是元音字母吗?

Description

输入一个英文字母,判断是否是元音字母。元音字母是:a,e,i,o u,A,E,I,O,U

Input

输入一个英文字母

Output

是元音字母,输出“yes”,否则输出“no”,行尾没有回车。

Sample Input

A

Sample Output

yes

AC代码(不要吐槽格式)

#include<stdio.h>
 
int main() {
    char c;
    scanf("%c", &c);
 
    switch(c) {
    case 'a':
        case 'e':
            case 'i':
                case 'o':
                    case 'u':
                        case 'A':
                            case 'E':
                                case 'I':
                                    case 'O':
                                        case 'U':
                                            printf("yes");
                                            break;
                                        default:
                                            printf("no");
                                            break;
    }
 
    return 0;
}

Problem D: 序数的后缀

Description

英文中经常用阿拉伯数字加上字母后缀表示“第几“这样的序数词。比如,”第10次会面“通常写成”10th meeting“。

后缀来源于英文的序数词:第1的英文是first,写成”1st‘;第2的英文是second,写成“2nd”;第3的英文是third,写成“3rd”,第4是fourth,写成“4th”,以后的数字都加“th”。

在这里规定,所有后缀为1的数字都写成“st”结尾,后缀为2的数字写成“nd”结尾,后缀为3的英文写成“rd”结尾,其他的写成“th”结尾。

Input

输入为多个很小的正整数,当输入为0时表示输入结束。

Output

输出为多行,每行对应一个输入数字的序数表示。

Sample Input

1 2 3 4 5 10 11 12 13 14 0

Sample Output

1st
2nd
3rd
4th
5th
10th
11st
12nd
13rd
14th

HINT

用switch语句似乎更容易些。

AC代码

然而并没有用switch。

#include <stdio.h>

int main() {
    int m, n;

    while (1) {
        scanf("%d", &n);
        if (n == 0) {
            break;
        }

        if (n <= 10) {
            if (n == 1) {
                printf("%dst\n", n);
            } else if (n == 2) {
                printf("%dnd\n", n);
            } else if (n == 3) {
                printf("%drd\n", n);
            } else {
                printf("%dth\n", n);
            }
        } else {
            m = n % 10;
            if (m == 1) {
                printf("%dst\n", n);
            } else if (m == 2) {
                printf("%dnd\n", n);
            } else if (m == 3) {
                printf("%drd\n", n);
            } else {
                printf("%dth\n", n);
            }
        }
    }
}

Problem E: 简单的数值统计

Description

现有一堆非零整数,要求统计其中正数、负数的个数以及它们的平均值。

Input

输入一系列整数,仅有最后一个数字是0,表示输入的结束。所有数据以及它们的和都在int的表示范围之内。

Output

输出有2行。如果有负数,第一行输出负数的个数和平均值,否则第一行输出0;如果有正数,第二行输出正数的个数以及平均值,否则第二行输出0。每行输出如果有2个数,则用空格隔开。平均值只保留2位小数。

Sample Input

1 2 3 4 -1 -2 -3 -4 0

Sample Output

4 -2.50
4 2.50

AC代码

#include <stdio.h>

int main() {
    int number;
    int countPositive=0,countNegative=0;
    int sumPositive=0,sumNegative=0;
    float avgPositive,avgNegative;
    scanf("%d",&number);
    while(number != 0) {
        if(number < 0) {
            sumPositive += number;
            countPositive++;
        }
        else {
            sumNegative += number;
            countNegative++;
        }
        scanf("%d",&number);
    }

    avgPositive = (sumPositive * 1.0) / countPositive;
    avgNegative = (sumNegative*1.0) / countNegative;
    if(countPositive != 0)
        printf("%d %.2f\n", countPositive, avgPositive);
    else
        printf("%d\n", countPositive);
    if(countNegative != 0)
        printf("%d %.2f\n", countNegative, avgNegative);
    else
        printf("%d\n", countNegative);
    return 0;
}

Problem F: 求累加和

Description

编程求min~max的累加和(含min和max),其中max>=min>0。

Input

输入为多行。第一行是一个整数N>0,表示后面有N个测试用例。后面有N行,每行包含2个整数,分别是min和max。

Output

输出为N行,每个测试用例的计算结果占据一行。每行的格式为:

case i:sum=s.

其中i表示测试用例的编号(从1开始),s是该测试用例对应的累加和(设不超过int的表示范围)。

Sample Input

2
1 10
1 100

Sample Output

case 1:sum=55.
case 2:sum=5050.

AC代码

#include<stdio.h>

int main() {
    int N, i, j, sum, a, b;
    scanf("%d", &N);
    for(i = 0; i < N; ++i) {
        scanf("%d%d", &a, &b);
        sum = 0;
        for(j = a; j <= b; ++j) {
            sum += j;
        }
        printf("case %d:sum=%d.\n", i + 1, sum);
    }
    return 0;
}