[蓝蓝计算机考研算法训练二期]-day13

112 阅读1分钟

17、学生成绩

现有若干个学生(不超过100的数据记录),每个记录包括学号姓名,三科成绩,学号不超过15位,且有字母。成绩位整数,每个学生的姓名不超过10个字母,且是包含字母,读入n条记录,再按要求输出。

输出

学生数量N占一行,每个学生的学号、姓名、三科成绩占一行,空格分开。

输出

每个学生的学号、姓名、三科成绩占一行,逗号分开。

输入样例

2

a111 zhblue 70 80 90

b111 newsclan 90 85 75

输出样例

a111 zhblue 70 80 90

b111 newsclan 90 85 75

思路

具体实现

#include <stdio.h>
#include <string.h>

#define MAX_STUDENT_NUM 100
#define MAX_ID_LEN 16
#define MAX_NAME_LEN 11

typedef struct {
    char id[MAX_ID_LEN];
    char name[MAX_NAME_LEN];
    int score[3];
} Student;

int main() {
    int n;
    Student students[MAX_STUDENT_NUM];

    scanf("%d", &n);
    for (int i = 0; i < n; i++) {
        scanf("%s%s%d%d%d", students[i].id, students[i].name, 
              &students[i].score[0], &students[i].score[1], &students[i].score[2]);
    }
    printf("\n"); 

    for (int i = 0; i < n; i++) {
        printf("%s %s %d %d %d\n", students[i].id, students[i].name, 
               students[i].score[0], students[i].score[1], students[i].score[2]);
    }

    return 0;
}

image.png

18、求和

s=1!+2!+3!+···+10!

方法一

思路

常规思路,分别计算阶乘之后相加。

具体实现

#include <stdio.h>

int main() {
    int i, j;
    int sum = 0, factorial = 1;
    
    for (i = 1; i <= 10; i++) {
        factorial = 1;
        for (j = 1; j <= i; j++) {
            factorial *= j;
        }
        sum += factorial;
    }
    
    printf("1! + 2! + 3! + ... + 10! = %d\n", sum);
    
    return 0;
}

image.png

方法二

思路

使用一个数组来分别存储每个数字的阶乘,再循环相加即可。时间复杂度从方法一的O(n2n^2)降低为O(n)。

具体实现

#include <stdio.h>

#define N 10

int main() {
    int i;
    int sum = 0;
    int factorial[N+1]; // 存储阶乘的值

    factorial[0] = 1; // 0! = 1

    // 预处理所有数字的阶乘,处理的同时进行求和 
    for (i = 1; i <= N; i++) {
        factorial[i] = factorial[i-1] * i;
        sum += factorial[i];
    }

    printf("1! + 2! + 3! + ... + 10! = %d\n", sum);

    return 0;
}

image.png

小结

今天的算法不难,第一题使用了结构体,很纯粹的结构体用法。第二题主要是惯性思维直接就使用了双重循环来进行计算,方法二使用了利用数组来存储阶乘的数字,一边阶乘,一边进行求和运算,虽有一点额外空间使用,但是降低了时间复杂度。