2025级C语言第五次周测题解

R7-1 求数组中偶数之和

分数 30

作者 王立香

单位 山东理工大学

从键盘输入n个整数存入一维数组中,计算数组元素中所有偶数之和并输出。

输入格式:

第一行,输入整数个数n;
第二行,n 个整数,数据之间用空格隔开。

输出格式:

输出和,最后换行。

输入样例:

8
10 19 18 16 17 15 14 13

输出样例:

58

参考答案:

#include<stdio.h>

int main()
{
    int n;
    scanf("%d",&n);
    int num[n];
    int sum = 0;
    for(int i = 0 ; i < n ; i++){
        scanf("%d",&num[i]);
        if(num[i] % 2 == 0){
            sum += num[i];
        }
    }
    printf("%d",sum);
}

R7-2 求一组数平均数。

分数 30

作者 赵静静

单位 浙江工贸职业技术学院

实现求一组正数平均数的功能,这一组数个数不定,由用户输入控制,当输入为-1时,输入结束,-1不计入。

输入格式:

请在这里写输入格式。例如:输入在一行中给出n 个数 ,-1表示输入结束。

输出格式:

请在这里描述输出格式。例如:对每一组输入,在一行中输出平均值,保留2位小数。

输入样例:

在这里给出一组输入。例如:

3 6 9 21 -1

输出样例:

在这里给出相应的输出。例如:

avg = 9.75

参考答案:

#include <stdio.h>
int main (void) {
    double number, count = 0, sum = 0;
    while(scanf("%lf", &number)){
        if(number == -1){
            if(count == 0){
                printf("avg = 0.00");
            }else{
                double avg = sum / count;
                printf("avg = %.2lf", avg);
            }
            break;
        }else{
            sum += number;
            count ++;
        }
    }
    return 0;
}

R7-3 计算军事训练成绩平均分

分数 30

作者 袁恩

单位 中国人民解放军陆军工程大学

连队测试完体能,输入士兵体能成绩,体能成绩为整数,读入0则结束,如果读入的成绩低于0或者超过100则过滤该成绩,计算这些数中正整数的平均值,保留两位小数。

输入格式:

输入若干整数,以空格隔开。

输出格式:

输出平均值,保留两位小数。

输入样例:

100 90 85 120 -20 30 0

输出样例:

76.25

参考答案:

#include <stdio.h>
int main (void) {
    int score, count = 0;
    double avg = 0;
    while(scanf("%d", &score)){
        if(score == 0){
            if(count == 0){
                printf("0.00");
            }else{
                avg = avg / count;
                printf("%.2lf", avg);
            }
            break;
        }else if(score > 0 && score <= 100){
            avg += score;
            count ++;
        }
    }
    return 0;
}

R7-4 求N分之一序列前N项和

分数 30

作者 C课程组

单位 浙江大学

本题要求编写程序,计算序列 1 + 1/2 + 1/3 + ... 的前N项之和。

输入格式:

输入在一行中给出一个正整数N。

输出格式:

在一行中按照“sum = S”的格式输出部分和的值S,精确到小数点后6位。题目保证计算结果不超过双精度范围。

输入样例:

6

输出样例:

sum = 2.450000

参考答案:

#include <stdio.h>
int main (void) {
    int n;
    scanf("%d", &n);
    double sum = 0;
    for(int i = 1; i <= n; i++){
        sum += 1.0 / i;
    }
    printf("sum = %.6lf", sum);
    return 0;
}

R7-5 求简单交错序列前N项和

分数 30

作者 C课程组

单位 浙江大学

本题要求编写程序,计算序列 1 - 1/4 + 1/7 - 1/10 + ... 的前N项之和。

输入格式:

输入在一行中给出一个正整数N。

输出格式:

在一行中按照“sum = S”的格式输出部分和的值S,精确到小数点后三位。题目保证计算结果不超过双精度范围。

输入样例:

10

输出样例:

sum = 0.819

参考答案:

#include <stdio.h>
int main (void) {
    int n, flag = 1, number = 1;
    scanf("%d", &n);
    double sum = 0;
    for(int i = 1; i <= n; i++){
        sum += 1.0 / number * flag;
        flag = - flag;
        number += 3;
    }
    printf("sum = %.3lf", sum);
    return 0;
}

R7-6 求交错序列前N项和

分数 30

作者 陈建海

单位 浙江大学

本题要求编写程序,计算交错序列 1-2/3+3/5-4/7+5/9-6/11+... 的前N项之和。

输入格式:

输入在一行中给出一个正整数N。

输出格式:

在一行中输出部分和的值,结果保留三位小数。

输入样例:

5

输出样例:

0.917

参考答案:

#include <stdio.h>
int main (void) {
    int n, flag = 1, number = 1;
    scanf("%d", &n);
    double sum = 0;
    for(int i = 1; i <= n; i++){
        sum += i * 1.0 / number * flag;
        flag = -flag;
        number += 2;
    }
    printf("%.3lf", sum);
    return 0;
}

R7-7 水仙花数

分数 20

作者 徐镜春

单位 浙江大学

水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。例如:153=13+53+33。 本题要求编写程序,计算所有N位水仙花数。

输入格式:

输入在一行中给出一个正整数N(3≤N≤7)。

输出格式:

按递增顺序输出所有N位水仙花数,每个数字占一行。

输入样例:

3

输出样例:

153
370
371
407

参考答案:

#include <stdio.h>
#include <math.h>
int main (void) {
    int n;
    scanf("%d", &n);
    int begin = pow(10, n-1), end = pow(10, n);
    for(int i = begin; i < end; i++){
        int sum = 0, temp = i;
        while(temp != 0){
            int number = temp % 10;
            sum += pow(number, n);
            temp /= 10;
        }
        if(sum == i){
            printf("%d\n", i);
        }
    }
    return 0;
}

R7-8 计算天数

分数 20

作者 沈睿

单位 浙江大学

本题要求编写程序计算某年某月某日是该年中的第几天。

输入格式:

输入在一行中按照格式“yyyy/mm/dd”(即“年/月/日”)给出日期。注意:闰年的判别条件是该年年份能被4整除但不能被100整除、或者能被400整除。闰年的2月有29天。

输出格式:

在一行输出日期是该年中的第几天。

输入样例1:

2009/03/02

输出样例1:

61

输入样例2:

2000/03/02

输出样例2:

62

参考答案:

#include <stdio.h>
int main (void) {
    int year, month, day;
    int month_count[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    scanf("%04d/%02d/%02d", &year, &month, &day);
    if(year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)){
        month_count[1] = 29;
    }
    for(int i = 0; i < month-1; i++){
        day += month_count[i];
    }
    printf("%d", day);
    return 0;
}

R7-9 矩阵运算

分数 20

作者 C课程组

单位 浙江大学

给定一个n×n的方阵,本题要求计算该矩阵除副对角线、最后一列和最后一行以外的所有元素之和。副对角线为从矩阵的右上角至左下角的连线。

输入格式:

输入第一行给出正整数n(1<n≤10);随后n行,每行给出n个整数,其间以空格分隔。

输出格式:

在一行中给出该矩阵除副对角线、最后一列和最后一行以外的所有元素之和。

输入样例:

4
2 3 4 1
5 6 1 1
7 1 8 1
1 1 1 1

输出样例:

35

参考答案:

#include <stdio.h>
int main (void) {
    int n, matrix[15][15], sum = 0;
    scanf("%d", &n);
    for(int i = 0; i < n; i++){
        for(int j = 0; j < n; j++){
            scanf("%d", &matrix[i][j]);
            sum += matrix[i][j];
        }
    }
    /*
    sum: 所有元素之和
    sum1:副对角线之和
    sum2:最后一行之和
    sum3:最后一列之和
    */
    int sum1, sum2, sum3, index;
    (sum1 = sum2 = sum3 = 0), (index = n-1);
    for(int i = 0; i < n; i++){
        sum1 += matrix[i][index];
        index--;
    }

    for(int i = 0; i < n; i++){
        sum2 += matrix[n-1][i];
    }

    for(int i = 0; i < n; i++){
        sum3 += matrix[i][n-1];
    }
    
    int answer = sum - sum1 - sum2 - sum3 + matrix[0][n-1] + matrix[n-1][0] + matrix[n-1][n-1];
    printf("%d", answer);
    return 0;
}

R7-10 输出GPLT

分数 10

作者 陈越

单位 浙江大学

给定一个长度不超过10000的、仅由英文字母构成的字符串。请将字符重新调整顺序,按GPLTGPLT....这样的顺序输出,并忽略其它字符。当然,四种字符(不区分大小写)的个数不一定是一样多的,若某种字符已经输出完,则余下的字符仍按GPLT的顺序打印,直到所有字符都被输出。

输入格式:

输入在一行中给出一个长度不超过10000的、仅由英文字母构成的非空字符串。

输出格式:

在一行中按题目要求输出排序后的字符串。题目保证输出非空。

输入样例:

pcTclnGloRgLrtLhgljkLhGFauPewSKgt

输出样例:

GPLTGPLTGLTGLGLL

参考答案:

#include <stdio.h>
int main (void) {
    char str[100000];
    gets(str);
    int G, P, L, T, len = strlen(str);
    G = P = L = T = 0;
    for(int i = 0; i < len; i++){
        if(str[i] == 'G' || str[i] == 'g'){
            G++;
        }else if(str[i] == 'P' || str[i] == 'p'){
            P++;
        }else if(str[i] == 'L' || str[i] == 'l'){
            L++;
        }else if(str[i] == 'T' || str[i] == 't'){
            T++;
        }
    }
    while(G != 0 || P != 0 || L != 0 || T != 0){
        if(G != 0){
            printf("G");
            G--;
        }
        if(P != 0){
            printf("P");
            P--;
        }
        if(L != 0){
            printf("L");
            L--;
        }
        if(T != 0){
            printf("T");
            T--;
        }
    }
    return 0;
}

R7-11 组个最小数

分数 10

作者 曹鹏

单位 Google

给定数字0-9各若干个。你可以以任意顺序排列这些数字,但必须全部使用。目标是使得最后得到的数尽可能小(注意0不能做首位)。例如:给定两个0,两个1,三个5,一个8,我们得到的最小的数就是10015558。

现给定数字,请编写程序输出能够组成的最小的数。

输入格式:

输入在一行中给出10个非负整数,顺序表示我们拥有数字0、数字1、……数字9的个数。整数间用一个空格分隔。10个数字的总个数不超过50,且至少拥有1个非0的数字。

输出格式:

在一行中输出能够组成的最小的数。

输入样例:

2 2 0 0 0 3 0 0 1 0

输出样例:

10015558

参考答案:

#include <stdio.h>
int main (void) {
    int count[10] = {0};
    for(int i = 0; i < 10; i++){
        scanf("%d", &count[i]);
    }
    for(int i = 1; i < 10; i++){
        if(count[i] != 0){
            printf("%d", i);
            count[i]--;
            break;
        }
    }
    for(int i = 0; i < 10; i++){
        while(count[i] != 0){
            printf("%d", i);
            count[i]--;
        }
    }
    return 0;
}

R7-12 最长对称子串

分数 10

作者 陈越

单位 浙江大学

对给定的字符串,本题要求你输出最长对称子串的长度。例如,给定Is PAT&TAP symmetric?,最长对称子串为s PAT&TAP s,于是你应该输出11。

输入格式:

输入在一行中给出长度不超过1000的非空字符串。

输出格式:

在一行中输出最长对称子串的长度。

输入样例:

Is PAT&TAP symmetric?

输出样例:

11

参考答案:

#include <stdio.h>
int main (void) {
    char str[1005];
    gets(str);
    int max_count = 1, len = strlen(str);
    for(int i = 0; i < len; i++){
        for(int j = len-1; j >= i; j--){
            if(str[i] == str[j]){
                int left = i, right = j;
                while(left < right){
                    if(str[left] == str[right]){
                        left++;
                        right--;
                    }else{
                        break;
                    }
                }
                if(left >= right){
                    max_count = max_count > (j - i + 1) ? max_count:(j - i + 1);
                }
            }
        }
    }
    printf("%d", max_count);
    return 0;
}

R7-13 九宫格输入法

分数 10

作者 周强

单位 青岛大学

假设有九宫格输入法键盘布局如下:

 [ 1,.?! ] [ 2ABC ] [ 3DEF  ]
 [ 4GHI  ] [ 5JKL ] [ 6MNO  ]
 [ 7PQRS ] [ 8TUV ] [ 9WXYZ ]
           [ 0空  ]

注意:中括号[ ]仅为了表示键盘的分隔,不是输入字符。每个中括号中,位于首位的数字字符即是键盘的按键,按一下即可输入该数字字符。多次按同一个键,则输入的字符依次循环轮流,例如按两次3,则输入D;按5次7,则输入S;按6次2,则输入A。按键0的输入组合是0空格字符,即按两次0输入空格。

你需要对于给定的按键组合,给出该组合对应的文本。

输入格式:

输入在一行中给出数个字符的按键组合(例如 999 表示按3次9),每个字符的按键组合之间用空格间隔,最后一个输入法组合之后以换行结束。输入数据至少包括一个字符的按键组合,且输入总长度不超过500个字符。

输出格式:

在一行中输出该按键组合对应的文本。

输入样例:

22 5555 22 666 00 88 888 7777 4444 666 44

输出样例:

ALAN TURING

参考答案:

#include <stdio.h>
int main (void) {
    char keyboard[10][6] = {
        "0 ",
        "1,.?!", "2ABC", "3DEF",
        "4GHI", "5JKL", "6MNO",
        "7PQRS", "8TUV", "9WXYZ",
    };
    char input[505];
    while(scanf("%s", input) != EOF){
        int count = strlen(input) - 1, x = input[0] - '0';
        if(x == 1 || x == 7 || x == 9){
            count %= 5;
        }else if(x == 2 || x == 3 || x == 4 || x == 5 || x == 6 || x == 8){
            count %= 4;
        }else if(x == 0){
            count %= 2;
        }
        printf("%c", keyboard[x][count]);
    }
    return 0;
}
// 2025/11/23 01:18 GuoQiZhan

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值